WPF DataGrid 中的自定义复选框不更新绑定

Posted

技术标签:

【中文标题】WPF DataGrid 中的自定义复选框不更新绑定【英文标题】:Custom CheckBox in WPF DataGrid does not update binding 【发布时间】:2011-02-24 23:22:06 【问题描述】:

我有以下(简化的)风格:

<Style x:Key="MyStyle" TargetType="x:Type CheckBox">  
    <Setter Property="Background" Value="Blue" />  
</Style>

如果我将它用作 DataGridCheckBoxColumn 中的 ElementStyle 和 EditingElementStyle:

<DataGridCheckBoxColumn Binding="Binding IsEnabled"  
                        ElementStyle="StaticResource MyStyle"  
                        EditingElementStyle="StaticResource MyStyle" />

然后,当我选中/取消选中一行的复选框时,我的绑定 IsEnabled 不会切换。如果我删除 ElementStyle、EditingElementStyle 或两者中的任何一个,则绑定更新没有问题。这是为什么?!

另外,我尝试使用以下代码解决此问题:

<DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <CheckBox IsChecked="Binding IsEnabled"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

但是,问题仍然存在。

【问题讨论】:

【参考方案1】:

对不起,我想我在 Stack Overflow 上找到了一个更好的解决方案,这可能会帮助人们最终在此页面上搜索解决方案。

https://***.com/a/7270548/3082531

<DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <CheckBox IsChecked="Binding Path=IsSelected, UpdateSourceTrigger=PropertyChanged" />
    </DataTemplate>
</DataGridTemplateColumn.CellTemplate>

我试过了,它对我来说效果很好,比公认的解决方案更简单,而且不需要额外点击复选框。

【讨论】:

同意 - 这很简单。【参考方案2】:

首先,您断言如果您删除 ElementStyleEditingElementStyle 解决问题是不正确的,那么让您感到困惑的是 ElementStyle

问题是,要进行编辑,数据网格必须切换到编辑模板,这通常在鼠标单击时执行,但是,由于CheckBox 处理鼠标单击事件,数据网格永远不会得到它,并且永远不会进入编辑模式,从而防止您的更改到达您的数据对象(它保留在数据视图中,但不会传递给源数据)。

现在您可能会问,为什么默认行为可以?好吧,如果您查看ElementStyle 属性的默认值,您会注意到它将IsHitTestVisibleFocusable 都设置为false。这可以防止CheckBox 处理更改其状态的鼠标单击(或键盘事件),并允许数据网格接收它们,从而使其更改进入编辑模式并切换到EditingElementStyle,这不会影响可聚焦性和命中可测试性。

查看此博客条目以获取有关如何正确执行此操作的示例When is a WPF DataGrid read-only CheckBox not read-only?

【讨论】:

以上是关于WPF DataGrid 中的自定义复选框不更新绑定的主要内容,如果未能解决你的问题,请参考以下文章

DataGrid中的WPF样式单元格和行

WPF DataGrid自动选择复选框错误?

c# wpf datagrid中选择所有复选框的代码

WPF DataGrid 自定义排序,其中一些记录被锁定

WPF MvvM DataGrid 动态列

wpf 4.0 datagrid模板列双向绑定问题