如何以编程方式清除MudDatagrid多选状态?解决重载选中残留问题
MudDataGrid 多选重载后选中状态残留问题解决办法
问题根源
你遇到的问题是因为MudDataGrid内部维护着选中项的引用集合,重载列表后旧的实体引用没被清除,即便你清空了自己的lstSerialNo,组件依然会把这些旧引用包含在SelectedItemsChanged的参数里。另外如果你的TestMain实体没正确实现相等性判断,组件也会误将新旧数据的实体视为同一对象,导致选中状态残留。
解决步骤
重载数据时清空组件内部选中状态
给MudDataGrid添加引用,在重载列表的方法里主动调用组件的清空选中方法:<!-- 给DataGrid添加ref --> <MudDataGrid @ref="_dataGrid" T="TestMain" SelectedItemsChanged="SelectedItemsChanged" ...> <!-- 列定义 --> </MudDataGrid>private MudDataGrid<TestMain> _dataGrid; // 你的重载列表方法,比如LoadData() private void LoadData() { // 先清空组件选中状态 _dataGrid?.ClearSelection(); // 然后加载新数据 // ...你的数据加载逻辑 }为TestMain实现正确的相等性判断
基于实体的唯一标识(比如假设你有Id字段)重写Equals和GetHashCode,让MudDataGrid能正确区分新旧实体:public class TestMain { public int Id { get; set; } // 假设这是唯一标识 public bool isPin { get; set; } public int StatusId { get; set; } public override bool Equals(object obj) { return obj is TestMain main && Id == main.Id; } public override int GetHashCode() { return HashCode.Combine(Id); } }优化SelectedItemsChanged方法
可以保留你原有的逻辑,也可选过滤掉当前数据列表中不存在的项:private void SelectedItemsChanged(HashSet<TestMain> selectedItems) { lstSerialNo.Clear(); if (selectedItems?.Any() == true) { // 可选:过滤掉当前数据列表中不存在的项 var validItems = selectedItems.Intersect(YourDataList); lstSerialNo.AddRange(validItems.Select(x => new TestMain { isPin = x.isPin, StatusId = x.StatusId, Id = x.Id })); } }
内容的提问来源于stack exchange,提问作者ABD
相关产品推荐
相关产品推荐

