有这样的一个DataGrid:
想要实现选择列全选/全不选功能,应该在表头也加个CheckBox最合适。问Google,写成了下面的样子:
<data:DataGridTemplateColumn.Header> <CheckBox x:Name="dgSelectAll" Content="全选"></CheckBox> </data:DataGridTemplateColumn.Header>
运行起来直接抛异常,继续问Google,也有人提到同样的问题,给出的办法是改用:DataGridTemplateColumn.HeaderStyle,如法炮制:
<data:DataGridTemplateColumn.HeaderStyle> <Style TargetType="localprimitives:DataGridColumnHeader"> <Setter Property="ContentTemplate"> <Setter.Value> <DataTemplate> <CheckBox x:Name="dgSelectAll" Content="全选"/> </DataTemplate> </Setter.Value> </Setter> </Style> </data:DataGridTemplateColumn.HeaderStyle>
localprimitives的名字空间为:
xmlns:localprimitives="clr-namespace:System.Windows.Controls.Primitives;assembly=System.Windows.Controls.Data"
这回果然正常运行,最终的代码:
<data:DataGrid.Columns> <data:DataGridTemplateColumn> <data:DataGridTemplateColumn.HeaderStyle> <Style TargetType="localprimitives:DataGridColumnHeader" BasedOn="{StaticResource DataGridColumnHeaderStyle}"> <Setter Property="ContentTemplate"> <Setter.Value> <DataTemplate> <CheckBox x:Name="dgSelectAll" Content="全选" Checked="dgSelectAll_Checked" Unchecked="dgSelectAll_Unchecked" /> </DataTemplate> </Setter.Value> </Setter> </Style> </data:DataGridTemplateColumn.HeaderStyle> <data:DataGridTemplateColumn.CellTemplate> <DataTemplate> <CheckBox x:Name="ckXQ" IsChecked="{Binding Select,Mode=TwoWay}" Click="ckXQ_Click" VerticalAlignment="Center" HorizontalAlignment="Center"/> </DataTemplate> </data:DataGridTemplateColumn.CellTemplate> </data:DataGridTemplateColumn> <data:DataGridTextColumn Header="2G/TD" Binding="{Binding Beizhu}" /> <data:DataGridTextColumn Header="小区名称" Binding="{Binding Zh_label}" /> <data:DataGridTextColumn Header="CI" Binding="{Binding Cell_id}" /> <data:DataGridTextColumn Header="微蜂窝宏蜂窝" Binding="{Binding Btslx}" /> </data:DataGrid.Columns>
效果图:
题外话,<CheckBox x:Name="ckXQ" IsChecked="{Binding Select,Mode=TwoWay}" Click="ckXQ_Click",这个Click事件,开始也是使用的Checked和Unchecked事件,奇怪的是后台List数据改变有差,我选择一个,在Checked事件中查找List数据变化,竟然无变化。我选择二个,第一次选中的List数据变了,绑定的Select变为1,第二次选中的依然无变。选择三个,第二次选中的变为1,第三次选中的无变,以此类推。改用Click事件才算正常,很奇怪呀。