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

MudBlazor 8.0.0-preview中MudDataGrid双击与SelectedItemChanged异常问题

解决MudBlazor 8.0.0-preview.7中DataGrid双击事件获取不到选中项的问题

问题原因

MudBlazor 8.x预览版本调整了事件触发逻辑,双击Grid行时OnDoubleClick会先于SelectedItemChanged执行,导致你在双击方法中拿到的_currentItem还是null。

解决方案

方案1:使用MudDataGrid原生的RowDoubleClick事件(推荐)

直接使用组件提供的行双击事件,该事件会直接传递当前行的绑定数据,无需依赖选中项变更事件:

修改Grid组件代码:

<MudDataGrid @ref=_mudTable T="IncomeDocCashItem" Items="@_items" 
             SelectedItemChanged=@SelectedItemChanged 
             SelectedItem=@_currentItem
             RowDoubleClick="OnRowDoubleClick" />

对应的处理方法:

async Task OnRowDoubleClick(DataGridRowClickEventArgs<IncomeDocCashItem> args)
{
    _currentItem = args.Item;
    await OpenDocAsync();
}

这个方案是最可靠的,因为RowDoubleClick是MudDataGrid专门为行双击场景设计的事件,版本迭代中行为更稳定。

方案2:在双击事件中直接从DOM元素获取当前行数据

通过Grid的GetItemFromElement方法,从双击的目标元素中直接提取绑定的行数据,不依赖选中项状态:

修改OnDoubleClick方法:

async Task OnDoubleClick(MouseEventArgs e)
{
    var targetElement = (ElementReference)e.Target;
    var item = _mudTable.GetItemFromElement(targetElement);
    if (item == null) return;
    
    _currentItem = item;
    await OpenDocAsync();
}

这种方式跳过了选中项变更的依赖,直接获取双击行的数据,避免事件顺序问题。

方案3:调整选中项变更的异步逻辑(不推荐)

如果坚持使用原有事件组合,可以将SelectedItemChanged改为异步方法并等待状态更新,但这种方式依赖框架内部实现,后续版本可能再次出问题:

修改选中项变更方法:

async Task SelectedItemChanged(IncomeDocCashItem item)
{
    _currentItem = item;
    await InvokeAsync(StateHasChanged);
}

然后在OnDoubleClick中短暂等待状态更新:

async Task OnDoubleClick(MouseEventArgs mouseEventarg)
{
    await Task.Delay(10);
    if (_currentItem == null)
        return;
    await OpenDocAsync();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 06:03:13