【问题标题】:Allow only one checkbox to be checked in datagrid只允许在数据网格中选中一个复选框
【发布时间】: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&lt;Item&gt;(Items);

标签: c# wpf


【解决方案1】:

我已经评论了您在此代码中遇到的问题:

var update = item.Update;
Items.ForEach(x => x.Update = false);
Items = new List<Item>(Items); //This creates a new, empty Items list
item.Update = update; //this item relates to an item in the collection that no longer exists

你应该有ObservableCollection&lt;Items&gt; Items,这样如果你从列表中添加/删除项目,绑定将随之而来,Item实现INotifyPropertyChanged。由于ObservableCollection不支持ForEach,您的代码变为:

    var update = item.Update;
    foreach(var element in Items)
    {
        element.Update=false;
    }
    item.Update = update; 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多