C# WPF数据网格绑定和复选框

C# WPF数据网格绑定和复选框,c#,wpf,C#,Wpf,我有一个基本问题: 假设我有某个类的元素列表。我还有一个DataGrid,它显示列表中项目的属性。我希望用户通过额外的复选框列(实际上是datagridtemplatecolumn)选择一些项目。然后他按下按钮,一些功能只处理选定的项目。 我应该如何实现此复选框的逻辑 我应该向类中添加布尔属性并将其绑定到复选框列吗?(我认为,仅仅为了UI而在我的核心类中添加一个额外的属性是不好的) 我是否应该创建一些具有布尔属性的包装类,并将DataGrid绑定到包装类列表?(比第一个变体更符合OOP规则) 创

我有一个基本问题:

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

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

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

  • 创建一个未绑定的复选框列。然后检查循环中的datagrid行,以在处理之前收集所选项目。(这就是我想要做的,但是unbound checkbox列的行为非常奇怪:当我切换一个复选框时,其他两个复选框也会被切换。而且我也没有找到查看DataGrid所有行的方法)

  • 你的变种


  • 我想根据OOP规则来做这些事情。这是主要要求。这就是为什么我不能接受第一个变体,除非你告诉我它是可以使用的

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

    我们也遇到了同样的困境,最终选择了选项#1,向
    IsSelected
    类添加布尔属性,为什么?当问题真正归结到这一点时:

    • 这是最简单的
    • 可用于任何类型的绑定
    • 最后。。。因为他是被选出来的*
    当然,这可能违反了MVVM的一些黄金规则,但有时,这些规则注定要被打破



    *我记不起Josh提供的确切例子,但你可以在他的一篇博客文章中看到他的用法:

    我们也曾陷入同样的困境,最终得到了选项#1,向
    IsSelected
    类添加布尔属性,为什么?当问题真正归结到这一点时:

    • 这是最简单的
    • 可用于任何类型的绑定
    • 最后。。。因为他是被选出来的*
    当然,这可能违反了MVVM的一些黄金规则,但有时,这些规则注定要被打破



    *我记不起Josh提供的确切示例,但你可以在他的一篇博客文章中看到他的用法:

    伙计们,我只是尝试了这个解决方案,效果很好,也许不是最好的,但它确实有效

    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;
    
                        }
    
                    }
    

    伙计们,我只是尝试了这个解决方案,效果很好,也许不是最好的,但它确实有效

    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;
    
                        }
    
                    }
    

    我也有同样的想法,但一旦我选中datagrid中的复选框,Ilist就不会更新,你有没有一个例子来说明你是如何做到的?谢谢@GerardoJaramillo-我建议你开始一个新问题,也许在你的帖子中引用这个问题。一定要包括你的相关代码片段和任何其他有助于社区复制问题的内容。我也有同样的想法,但一旦我选中datagrid中的复选框,Ilist就不会更新,你有一个例子说明你是如何做到的吗?谢谢@GerardoJaramillo-我建议你开始一个新问题,也许在你的帖子中引用这个问题。请确保包含相关的代码片段和任何有助于社区复制问题的内容。