我尝试在包含DataGrid
的{{1}}中创建一个列。按钮的ToggleButton
属性绑定到我的数据项中的IsChecked
属性(实现IsSelected
)。
单击按钮时,我的第一次尝试无法更新INotifyPropertyChanged
,即使在其他位置设置时正确显示了该值。
IsSelected
在stackexchange周围搜索,我找到了几个解决方案:
设置绑定的<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate DataType="{x:Type local:DataItem}">
<ToggleButton IsChecked="{Binding IsSelected}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
属性
UpdateSourceTrigger
或使用相对绑定
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate DataType="{x:Type local:DataItem}">
<ToggleButton IsChecked="{Binding IsSelected, UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
我的问题是,为什么使用直接绑定需要显式设置<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate DataType="{x:Type local:DataItem}">
<ToggleButton IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridCell}}, Path=DataContext.IsSelected}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
,而相对绑定方法不需要?
答案 0 :(得分:1)
这是因为What do you want?
>> None
具有内部事务行为,由DataGrid
实现,并且通常不会更新源,直到提交编辑为止。如果您的数据对象实现了BindingGroup
接口,您将注意到在编辑单元格值时将调用其IEditableObject
和BeginEdit()
方法。
有关详细信息,请参阅MSDN论坛上的以下主题:https://social.msdn.microsoft.com/Forums/vstudio/en-US/7f7196b8-b9dc-487d-93cd-e77f5b3d9906/confused-about-transactional-editing-edititemcanceledit?forum=wpf