我有一个基本问题:
假设我有一个类的元素列表。我还有一个DataGrid,显示此列表项的属性。我希望用户通过额外的复选框列(实际上是datagridtemplatecolumn)来选择一些项目。然后他按下按钮,只有某些功能处理了所选项目。 我该如何实现此复选框的逻辑?
我应该向我的类添加一个布尔属性并将其绑定到复选框列吗? (我认为,仅仅为了UI而向我的核心类添加一个额外的属性并不好)
我是否应该创建一个具有布尔属性的包装类并将DataGrid绑定到包装类列表? (比第一个变体更符合OOP规则)
制作未绑定的复选框列。然后检查循环中的datagrid行以在处理之前收集所选项。 (这是我想要做的,但是未绑定的复选框列表现得非常奇怪:当我切换一个复选框时,其他几个也被切换。而且我也没有找到一种方法来查看DataGrid的所有行)。
您的变种......
我想根据OOP规则做那些事情。这是主要要求。这就是为什么我不能接受第一个变体,除非你说我没关系并且常用。
答案 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为什么?当它真正归结为它时:
当然,这可能会违反一些黄金MVVM规则,但有时候,规则会被打破。
*我不记得Josh提供的确切示例,但您可以在他的一篇博文中看到他的用法:The Initially Selected Item when Binding to a Grouped ICollectionView