我有一个DataGrid列表,他的第一列就是一个checkbox组成的选择框列,而作为表头的checkbox需要进行全选/全反选的功能
界面对应的列是这样的
<DataGridTemplateColumn Width="80">
<DataGridTemplateColumn.HeaderTemplate>
<DataTemplate>
<Grid>
<CheckBox cal:Message.Attach="[Event Checked]=[Action ALLselected];[Event Unchecked]=[Action UnselectedAll]" IsChecked="{Binding IsSelectAll,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
HorizontalAlignment="Center" VerticalAlignment="Center"></CheckBox>
</Grid>
</DataTemplate>
</DataGridTemplateColumn.HeaderTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox IsEnabled="{Binding SelEnabled,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" IsChecked="{Binding IsChoosen,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"></CheckBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
可知,即使绑定了Ischecked属性,却是跟Itemsource里面的Ischecked有冲突,这个时候只要把对应Datacontext也进行绑定就越好,datacontext的绑定需要说明RelativeSource
为本窗口或者usercontrol(这个根据实际的当前的View的类型来),改好之后的xaml如下
<DataGridTemplateColumn Width="80">
<DataGridTemplateColumn.HeaderTemplate>
<DataTemplate>
<Grid>
<CheckBox DataContext="{Binding DataContext,RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" IsEnabled="{Binding CheckEnabled,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" IsChecked="{Binding IsSelectAll,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" cal:Message.Attach="[Event Checked]=[Action ALLselected];[Event Unchecked]=[Action UnselectedAll]"
HorizontalAlignment="Center" VerticalAlignment="Center"></CheckBox>
</Grid>
</DataTemplate>
</DataGridTemplateColumn.HeaderTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox IsEnabled="{Binding SelEnabled,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" IsChecked="{Binding IsChoosen,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"></CheckBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
这样,Ischecked就会绑定到当前view的viewmodel下,不受ItemSource里面的影响,对于我们进行全选反选很方便,同时也是个单个绑定的示例,自己记录下