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

C# WPF DataGrid中的自定义复选框不更新绑定,c#,wpf,datagrid,binding,C#,Wpf,Datagrid,Binding,我有以下(简化的)风格: 但是,问题仍然存在。首先,如果删除ElementStyle或EditingElementStyle解决了这个问题,那么你的断言是不正确的,你所做的是ElementStyle 问题是,要进行编辑,数据网格必须切换到编辑模板,这通常是在鼠标单击时进行的,但是,由于复选框处理鼠标单击事件,数据网格永远不会得到它,也永远不会进入编辑模式,从而阻止您的更改到达数据对象(它保留在数据视图中,但不会传递给源数据) 现在您可能会问,为什么默认行为是可以的?如果您查看ElementSty

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


但是,问题仍然存在。

首先,如果删除
ElementStyle
EditingElementStyle
解决了这个问题,那么你的断言是不正确的,你所做的是
ElementStyle

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

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


查看此博客文章,了解如何正确执行此操作的示例

对不起necro,但我认为我在这里找到了一个关于堆栈溢出的更好解决方案,这可能有助于人们在此页面上搜索解决方案



我尝试了这个方法,它对我来说非常有效,比公认的解决方案更简单,而且不需要额外点击复选框。

同意-这是非常直接的。
<Style x:Key="MyStyle" TargetType="{x:Type CheckBox}">  
    <Setter Property="Background" Value="Blue" />  
</Style>
<DataGridCheckBoxColumn Binding="{Binding IsEnabled}"  
                        ElementStyle="{StaticResource MyStyle}"  
                        EditingElementStyle="{StaticResource MyStyle}" />
<DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <CheckBox IsChecked="{Binding IsEnabled}"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <CheckBox IsChecked="{Binding Path=IsSelected, UpdateSourceTrigger=PropertyChanged}" />
    </DataTemplate>
</DataGridTemplateColumn.CellTemplate>