DataGridCheckboxColumn双向绑定

30

我正在使用.NET 3.5中的WPF工具包中的DataGrid。

我有一个datagrid列与我的源对象中的布尔属性绑定。

复选框正确调用了布尔属性的get访问器。

然而,当勾选或取消勾选该框时,调用的是get方法而不是set方法。

<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Object,  Source={StaticResource model}, Mode=TwoWay}">
        <DataGrid.Columns>
            <DataGridCheckBoxColumn Binding="{Binding BoolProperty, mode=TwoWay}"/>                
        </DataGrid.Columns>
</DataGrid>

如果我改为使用一个包含复选框的DataGridTemplateColumn,则属性会被正确设置,但是这样就更难创建一个漂亮的布局。

<DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <CheckBox IsChecked="{Binding BoolProperty, Mode=TwoWay}"/>                            
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

我在使用DataGridCheckBoxColumn时做错了什么?

4个回答

58

我跟你遇到了同样的问题,这是我的解决方案

<CheckBox HorizontalAlignment="Center" IsChecked="{Binding BoolProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

谢谢您,先生。在找到这个解决方案之前,我不得不在网上搜索一段时间。它非常有效。 - Mash
6
"TwoWay" 不必要,因为它是默认设置。 - Den
有趣的是,在WinUI3中,只有这种方式有效。 我尝试了下面的方法进行绑定,但没有成功。 <DataGridCheckBoxColumn Header="布尔属性" Binding="{Binding BoolProperty, UpdateSourceTrigger=PropertyChanged}"></DataGridCheckBoxColumn> - Will Young

53

我的解决方案是将UpdateSourceTrigger设置为PropertyChanged。

<DataGridCheckBoxColumn Header="Bool property" Binding="{Binding BoolProperty, UpdateSourceTrigger=PropertyChanged}"></DataGridCheckBoxColumn>

5
这是最佳答案。 - pennyrave
1
这是答案 - JobaDiniz

11

DataGrid中的绑定直到您结束行/单元格的编辑才会被提交。如果您按Enter键,则绑定将应用回源。

使用此类模板会覆盖该行为,但我不建议这样做。另外,明确设置TwoWay也不是必要的。


好的,谢谢。在这种情况下,行为是必要的,因为当用户勾选框时,我想在屏幕上进行视觉更新。是否有一种使用DatGridCheckBoxColumn来实现这一点的方法?另外,在初始单击时,用户不需要点击两次才能选择行和复选框的最佳方法是什么?您可以使用鼠标悬停事件选择行吗? - DanBrum
@DanBrum:我不知道你是否可以通过使用该列来规避这个问题,如果找不到其他方法,你可以自定义自己的DataGridCheckBoxColumn。在鼠标悬停时进行选择应该是可行的。 - H.B.

7

我的解决方案是添加带有 Style TargetType="CheckBox" 的 ElementStyle:

<DataGridCheckBoxColumn Binding="{Binding BoolProperty, UpdateSourceTrigger=PropertyChanged}">
          <DataGridCheckBoxColumn.ElementStyle>
                 <Style TargetType="CheckBox"/>
          </DataGridCheckBoxColumn.ElementStyle>
</DataGridCheckBoxColumn>

这是最好的答案。谢谢兄弟。 - mincasoft

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接