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

 

posted @   【君莫笑】  阅读(290)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示