2010-08-05 62 views
2

我有一个基本问题:WPF DataGrid Binding and CheckBox

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

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

  2. 我应该制作一些包含布尔属性并将DataGrid绑定到包装类列表的包装类吗? (比第一个变体更符合OOP规则)

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

  4. 你变...

而且我想根据OOP的规则做到这一点的东西。这是主要要求。这就是为什么我不能接受第一个变体,除非你说我没问题,并且经常使用。

回答

1

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

-1

我们已经与同样的困境挣扎,并最终结束了加入一个布尔属性类的IsSelected为什么选择的#1?当它真的来到了它:

  • 这是最简单的
  • 可以改用于任何类型的结合
  • 终于......因为Josh Smith使用IsSelected *

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


*我不记得乔希提供确切的例子,但是你可以看到他使用在他的博客文章之一:The Initially Selected Item when Binding to a Grouped ICollectionView

+0

我有同样的想法,但一旦我检查数据网格中的复选框,Ilist不会得到更新,你有一个你如何做的例子吗? 谢谢! – 2012-11-26 19:14:23

+0

@GerardoJaramillo - 我建议你开始一个新的问题,也许在你的文章中引用这个问题。一定要包括您的相关代码片段和其他任何有助于社区复制问题的内容。 – 2012-11-26 21:26:12

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; 

        } 

       }