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
相关产品推荐
相关产品推荐

