2012-05-18 132 views
13

我在.NET 3.5中使用WPF工具包中的DataGrid。DataGridCheckboxColumn双向绑定

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

该复选框正确调用布尔的属性get accessor。

但是,当检查或取消选中框时,调用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?

回答

8

DataGrid中,在您结束对行/单元格的编辑之前,绑定不会被提交。如果按下输入,则绑定将应用回源。

使用这样的模板会覆盖该行为,但我不会推荐。明确设置TwoWay也不是必须的。

+0

好感谢在这种情况下的行为是必要的,当用户检查我想在视觉上更新的东西的盒子作为屏幕。有没有办法使用DatGridCheckBoxColumn来做到这一点?还有什么是最好的方式,以便在初始点击用户不必点击两次选择行然后复选框,你可以选择与鼠标悬停事件的行? – DanBrum

+0

@DanBrum:我不知道你是否可以绕过这个使用该列的方法,如果你找不到方法,你可以定义你自己的DataGridCheckBoxColumn。 MouseOver上的选择应该是可能的。 –

37

我有同样的问题与你,这里是我的解决方案

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

谢谢先生,在找到此解决方案之前,我不得不在网络上搜索一段时间。很棒。 – Mash

+2

'''TwoWay'''没有必要,因为它是默认的。 – Den

31

我的解决办法是UpdateSourceTrigger设置的PropertyChanged。

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

这是最好的答案。 – pennyrave

+0

这应该是答案 – JobaDiniz

3

我的解决办法是添加ElementStyle与样式的TargetType =“复选框”:

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