You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor中RadzenDataGrid行内RadzenDropDown启用禁用失效求助

解决方案:Blazor RadzenDataGrid中切换RadzenDropDown启用状态不生效问题

问题核心原因

Blazor组件更新依赖引用变化或属性变更通知。当修改User对象的internal_isEditingDisabled属性时,对象引用未改变,且User类未实现INotifyPropertyChanged接口,Blazor无法感知属性更新,因此不会重新渲染对应的RadzenDropDown控件。

修复方案

方案1:让User类实现INotifyPropertyChanged接口(推荐)

这是最规范的方式,能精准通知Blazor属性变化,仅刷新对应行的UI。

修改User类:

public class User : INotifyPropertyChanged
{
    public int id { get; set; }
    public string userName { get; set; }

    private bool _internal_isEditingDisabled = true;
    public bool internal_isEditingDisabled
    {
        get => _internal_isEditingDisabled;
        set
        {
            if (_internal_isEditingDisabled != value)
            {
                _internal_isEditingDisabled = value;
                OnPropertyChanged(nameof(internal_isEditingDisabled));
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

方案2:优化页面数据绑定并触发状态刷新

若不想修改User类,可将数据绑定到本地变量(避免每次渲染调用服务方法),并临时调用StateHasChanged()触发组件刷新:

<RadzenTabs>
    <Tabs>
        <RadzenTabsItem Text="Users">
            <RadzenDataGrid AllowFiltering="true" AllowColumnResize="true" AllowAlternatingRows="false" FilterMode="FilterMode.Advanced" AllowSorting="true" PageSize="10" AllowPaging="true" PagerHorizontalAlign="HorizontalAlign.Left" ShowPagingSummary="true"
                            Data="@_users" TItem="User" ColumnWidth="300px" LogicalFilterOperator="LogicalFilterOperator.Or">
                <Columns>
                    <RadzenDataGridColumn TItem="User" Property="id" Filterable="true" Title="ID" Frozen="true" Width="80px" TextAlign="TextAlign.Center" />
                    <RadzenDataGridColumn TItem="User" Property="userName" Title="Username" Frozen="true" Width="160px" />
                    <RadzenDataGridColumn TItem="User" Title="Groups" Frozen= "true" Width="180px">
                        <Template>
                            <RadzenDropDown Disabled="@context.internal_isEditingDisabled" Value="@_userRightsService.GetGroupsForUser(context).Select(i=> i.id).AsQueryable()" TValue="int" Data="@_groups" TextProperty="group_name" ValueProperty="id" Multiple=true AllowClear=true Placeholder="Select groups" Chips=true Style="width: 100%; max-width: 400px;"></RadzenDropDown>
                        </Template>
                    </RadzenDataGridColumn>
                    <RadzenDataGridColumn TItem="User" Title="Actions" Frozen="true" Width="180px">
                       <Template Context="user">
                           <RadzenButton Text="Edit" Click="@((x)=> onEditButtonClicked(x, user))"></RadzenButton>
                           <RadzenButton Text="Cancel"></RadzenButton>
                       </Template>
                    </RadzenDataGridColumn>
                </Columns>
            </RadzenDataGrid>
        </RadzenTabsItem>
        <RadzenTabsItem Text="Groups"></RadzenTabsItem>
        <RadzenTabsItem Text="Roles"></RadzenTabsItem>
    </Tabs>
</RadzenTabs>

@code {
    private List<User> _users;
    private List<Group> _groups; // 替换为你的组实体类型

    protected override async Task OnInitializedAsync()
    {
        await base.OnInitializedAsync();
        // 优先使用异步方法获取数据,同步方法直接赋值即可
        _users = await _userRightsService.GetUsersAsync();
        _groups = await _userRightsService.GetGroupsAsync();
    }

    private async Task onEditButtonClicked(MouseEventArgs eventArgs, User user)
    {
        user.internal_isEditingDisabled = !user.internal_isEditingDisabled;
        // 若未实现INotifyPropertyChanged,调用此方法触发组件刷新(会刷新整个DataGrid)
        StateHasChanged();
    }
}

补充说明

  • 方案1优势:仅更新属性变化的行,性能更优,是Blazor组件开发的最佳实践。
  • 方案2适合临时场景,但StateHasChanged()会刷新整个RadzenDataGrid,数据量大时可能影响性能。

内容的提问来源于stack exchange,提问作者Salman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 02:20:23