WPF DataGrid表头Checkbox 全选与全反选
WPF 在使用DataGrid展示数据的时候经常会使用到checkbox列,特别是id列
方法一:使用DataGridTemplateColumn自定义模板
先用模板把前台布局好
<DataGridTemplateColumn Header="选择" > <DataGridTemplateColumn.HeaderTemplate> <DataTemplate> <CheckBox Click="CheckBox_Click_3" ></CheckBox> </DataTemplate> </DataGridTemplateColumn.HeaderTemplate> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <CheckBox VerticalAlignment="Center" Loaded="CheckBox_Loaded_1" Tag="{Binding Id}" Click="CheckBox_Click_1" HorizontalAlignment="Center"></CheckBox> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn>
用模板的方式虽然灵活,但是不好获取到里边的控件,比如这里的checkbox
直接获取是不行的
private void CheckBox_Click_3(object sender, RoutedEventArgs e) { CheckBox headercb = (CheckBox)sender; for (int i = 0; i < mydg.Items.Count; i++) { //获取行 DataGridRow neddrow = (DataGridRow)mydg.ItemContainerGenerator.ContainerFromIndex(i); //获取该行的某列 CheckBox cb = (CheckBox)mydg.Columns[0].GetCellContent(neddrow); cb.IsChecked = headercb.IsChecked; } }
//获取并选中DependencyObject中的CheckBox public void GetVisualChild(DependencyObject parent) { int numVisuals = VisualTreeHelper.GetChildrenCount(parent); for (int i = 0; i < numVisuals; i++) { DependencyObject v = (DependencyObject)VisualTreeHelper.GetChild(parent, i); CheckBox child = v as CheckBox; if (child == null) { GetVisualChild(v); } else { child.IsChecked = true; return ; } } }
调用:
private void CheckBox_Click_3(object sender, RoutedEventArgs e) { GetVisualChild(mydg); }
我们可以找到需要的列在调用该方法 , 就可以不用遍历整个datagrid了,而且可以一次找到
private void CheckBox_Click_3(object sender, RoutedEventArgs e) { for (int i = 0; i < mydg.Items.Count; i++) { //获取行 DataGridRow neddrow = (DataGridRow)mydg.ItemContainerGenerator.ContainerFromIndex(i); //获取该行的某列 var cb = mydg.Columns[0].GetCellContent(neddrow); //获取到需要的列之后在去获取需要的控件 GetVisualChild(cb); } }
方法二:使用DataGridCheckBoxColumn
使用DataGridCheckBoxColumn只需要获取到第1列的内容就可以直接转化成chekbox了,然后操作就行了
前台:
<DataGridCheckBoxColumn > <DataGridCheckBoxColumn.HeaderTemplate > <DataTemplate> <CheckBox Click="CheckBox_Click_2" HorizontalAlignment="Center" VerticalAlignment="Center" Tag="{Binding Id}"></CheckBox> </DataTemplate> </DataGridCheckBoxColumn.HeaderTemplate> <DataGridCheckBoxColumn.CellStyle > <Style > <Setter Property="CheckBox.VerticalAlignment" Value="Center"></Setter> <Setter Property="CheckBox.HorizontalAlignment" Value="Center"></Setter> </Style> </DataGridCheckBoxColumn.CellStyle> </DataGridCheckBoxColumn>
private void CheckBox_Click_2(object sender, RoutedEventArgs e) { CheckBox headercb = (CheckBox)sender; for (int i = 0; i < mydg.Items.Count; i++) { //获取行 DataGridRow neddrow = (DataGridRow)mydg.ItemContainerGenerator.ContainerFromIndex(i); //获取该行的某列 CheckBox cb = (CheckBox)mydg.Columns[0].GetCellContent(neddrow); cb.IsChecked = headercb.IsChecked; } }
是使用DataGridCheckBoxColumn如何绑定数据又成了一个问题
为DataGridCheckBoxColumn绑定数据和设置一点简单的样式
<DataGridCheckBoxColumn > <DataGridCheckBoxColumn.HeaderTemplate > <DataTemplate> <CheckBox Click="CheckBox_Click_2" HorizontalAlignment="Center" VerticalAlignment="Center" Tag="{Binding Id}"></CheckBox> </DataTemplate> </DataGridCheckBoxColumn.HeaderTemplate> <!--为该列的CheckBox Tag属性绑定值--> <DataGridCheckBoxColumn.ElementStyle> <Style TargetType="CheckBox"> <Setter Property="Tag" Value="{Binding Id}"></Setter> </Style> </DataGridCheckBoxColumn.ElementStyle> <!--设置一点样式--> <DataGridCheckBoxColumn.CellStyle > <Style > <Setter Property="CheckBox.VerticalAlignment" Value="Center"></Setter> <Setter Property="CheckBox.HorizontalAlignment" Value="Center"></Setter> </Style> </DataGridCheckBoxColumn.CellStyle> </DataGridCheckBoxColumn>
来源:https://www.tnblog.net/aojiancc2/article/details/2536
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?