【发布时间】:2022-12-07 23:01:25
【问题描述】:
我有一个绑定到数据网格的列表,项目的属性是一个布尔值并绑定到数据网格中的复选框。
如何只允许选中一个复选框?
例如,如果选中一个复选框,则应取消选中其他复选框。
到目前为止我尝试了什么(在 ViewModel 中,更新是布尔属性):
var update = item.Update;
Items.ForEach(x => x.Update = false);
Items = new List<Item>(Items);
item.Update = update;
但这效率不高,它会抛出列表已修改的异常(集合已修改;枚举操作可能无法执行)。
有没有一种有效的方法来完成工作?
编辑:我正在使用 Binding 来绑定列表,列表来自 List<> 类型,列表中的项目实现了 INotifyPropertyChanged
【问题讨论】:
-
考虑使用单选按钮而不是复选框,因为您的应用程序的用户会期望任何复选框都是多选的,而单选按钮是单选的。这纯粹是我对良好用户体验的看法,不一定直接解决您的代码/问题。
-
如果只能选择一行,那么只需将那一行设置为 false 而不是全部?在这样的多选中,我还假设您已经知道被选中的那个,甚至不需要搜索它。
-
你在使用数据绑定吗?如果是这样,您使用的是
ObservableCollection吗?你的列表成员执行INotifyPropertyChanged吗?您的数据网格是如何填充的?请显示一些此代码。 -
@ChrisBD 我更新了我的帖子
-
如果你正在使用
ObservableCollection并且收集项目实现INotifyPropertyChanged你不需要Items = new List<Item>(Items);