WPF DataGrid绑定和CheckBox

时间:2010-08-05 23:55:30

标签: c# wpf

我有一个基本问题:

假设我有一个类的元素列表。我还有一个DataGrid,显示此列表项的属性。我希望用户通过额外的复选框列(实际上是datagridtemplatecolumn)来选择一些项目。然后他按下按钮,只有某些功能处理了所选项目。 我该如何实现此复选框的逻辑?

  1. 我应该向我的类添加一个布尔属性并将其绑定到复选框列吗? (我认为,仅仅为了UI而向我的核心类添加一个额外的属性并不好)

  2. 我是否应该创建一个具有布尔属性的包装类并将DataGrid绑定到包装类列表? (比第一个变体更符合OOP规则)

  3. 制作未绑定的复选框列。然后检查循环中的datagrid行以在处理之前收集所选项。 (这是我想要做的,但是未绑定的复选框列表现得非常奇怪:当我切换一个复选框时,其他几个也被切换。而且我也没有找到一种方法来查看DataGrid的所有行)。

  4. 您的变种......

  5. 我想根据OOP规则做那些事情。这是主要要求。这就是为什么我不能接受第一个变体,除非你说我没关系并且常用。

3 个答案:

答案 0 :(得分:1)

我投票给#2;它以MVVM模式凝聚,我认为这是在WPF中进行直接开发的唯一方法。通过这种方式,您可以创建一个视图模型类来包装您的域对象,以处理复选框和更改属性等之间的通信,同时触发PropertyChanged事件并使您的UI保持最新。

答案 1 :(得分:0)

伙计我只是尝试这个解决方案并且工作得很好,也许不是最好的但是有效。

bool? valor = false;
                foreach (var d in DetalleFactura.Items)
                {
                    DataGridRow row = (DataGridRow)DetalleFactura.ItemContainerGenerator.ContainerFromItem(d);
                    if (DetalleFactura.Columns[0].GetCellContent(row) is CheckBox)
                    {
                        valor = ((CheckBox)DetalleFactura.Columns[0].GetCellContent(row)).IsChecked;

                    }

                }

答案 2 :(得分:-1)

我们一直在努力解决同样的困境,并最终选择了为IsSelected类添加布尔属性的选项#1为什么?当它真正归结为它时:

  • 这是最简单的
  • 可以重新用于任何类型的绑定
  • 最后......因为Josh Smith使用了IsSelected *

当然,这可能会违反一些黄金MVVM规则,但有时候,规则会被打破。


*我不记得Josh提供的确切示例,但您可以在他的一篇博文中看到他的用法:The Initially Selected Item when Binding to a Grouped ICollectionView