最近在wpf项目中遇到当DataGrid的header中的checkbox选中,让该列的checkbox全选问题,为了不让程序员写自己的一堆事件,现写了一个自己的自定义控件

在DataGrid的 <DataGridTemplateColumn.HeaderTemplate> 中使用此控件即可

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace _UserControls
{
    public class DataGridHeaderCheckBox : CheckBox
    {
        public DataGridHeaderCheckBox()
        {
            this.Click += new System.Windows.RoutedEventHandler(DataGridHeaderCheckBox_Click);
        }

private int thisColumnIndex = 0;

/// <summary>
        /// 当前 CheckBox 列的索引,默认是 0
        /// </summary>
        public int ThisColumnIndex
        {
            get { return thisColumnIndex; }
            set { thisColumnIndex = value; }
        }

/// <summary>
        /// 当header列的checkbox选中时设置本列的checkbox全选或全不选
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void DataGridHeaderCheckBox_Click(object sender, System.Windows.RoutedEventArgs e)
        {
            DependencyObject parent = this;
            while ((parent = VisualTreeHelper.GetParent(parent)) != null)
            {
                if (parent is DataGrid)
                {
                    List<CheckBox> checkList = null;
                    DataGrid currentDataGrid = ((DataGrid)parent);
                    foreach (var item in currentDataGrid.Items)
                    {
                        DataGridTemplateColumn templeColumn = currentDataGrid.Columns[this.thisColumnIndex] as DataGridTemplateColumn;

FrameworkElement fwElement = currentDataGrid.Columns[this.thisColumnIndex].GetCellContent(item);

        ////有时  fwElement 会为 NULL 原因是datagrid是默认开启了ui virtualization ,VisualTree并不是所有的控件,为了显示加速,virtualization        ////默认的只会加载一定范围的控件,不显示的控件并不加载

        ////需要修改 DataGrid 的属性  EnableColumnVirtualization="False"     EnableRowVirtualization="False" 就可以了
                        if (fwElement != null)
                        {
                            checkList = ControlManager.GetChildObjects<CheckBox>(fwElement, typeof(CheckBox));
                            foreach (CheckBox ch in checkList)
                            {
                                ch.IsChecked = this.IsChecked;
                            }
                        }
                    }
                    break;
                }
            }
        }

}
}

xaml中的代码

<DataGridTemplateColumn Header="操作" Width="60">
                            <DataGridTemplateColumn.HeaderTemplate>
                                <DataTemplate>                                   
                                    <ctrls:DataGridHeaderCheckBox ThisColumnIndex="1" Content="操作" />
                                </DataTemplate>
                            </DataGridTemplateColumn.HeaderTemplate>
                            <DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <CheckBox Name="cb"></CheckBox>
                                </DataTemplate>
                            </DataGridTemplateColumn.CellTemplate>
                        </DataGridTemplateColumn>

wpf DataGrid CheckBox列全选的更多相关文章

  1. WPF DataGrid CheckBox 多选 反选 全选

    效果图 实现此效果的必要关键是 Style+DataTemplate 关键代码: <Window.Resources> <DataTemplate x:Key="Check ...

  2. MVVM框架下,WPF实现Datagrid里的全选和选择

    最近的一个项目是用MVVM实现,在实现功能的时候,就会有一些东西,和以前有很大的区别,项目中就用到了常用的序号,就是在Datagrid里的一个字段,用checkbox来实现. 既然是MVVM,就要用到 ...

  3. GridView中实现CheckBox的全选

    GridView中实现CheckBox的全选 用服务器端的方法: 在页面上放一个gridview控件,配置好数据源,编辑列, <asp:GridView ID="GridView1&q ...

  4. jQuery checkbox的全选与反选

    1:checkbox的全选与反选 js 代码 $("#cbAll").click(function(){ if($("#cbAll").is(":ch ...

  5. checkbox 的全选与全不选

    checkbox 的全选与全不选 只需要调用 cekAll.check();方法,这个方法接收两个参数: 参数一: 全选按钮的 id 以字符串的形式写 参数二: 其他 checkbox 的 name ...

  6. 通过VBA实现checkbox的全选和反选

    checkbox的全选和反选可以通过VBA来控制,这种设计常见于一些交互式报表,代码如下: 1.分成两个IF判断 Private Sub CheckBox1_Click()  ‘checkbox为总控 ...

  7. jquery checkbox 选中 全选 插件

    checkbox  选中 全选 在项目中经常用到,但是不同的程序员写出的东西各有差异,在此整合了jquery checkbox插件,用起来很方便,也总结了我们项目中通常会出现问题的地方,一行代码搞定. ...

  8. WPF DataGrid某列使用多绑定后该列排序失效,列上加入 SortMemberPath 设置即可.

    WPF DataGrid某列使用多绑定后该列排序失效 2011-07-14 10:59hdongq | 浏览 1031 次  悬赏:20 在wpf的datagrid中某一列使用了多绑定,但是该列排序失 ...

  9. Android高级控件(一)——ListView绑定CheckBox实现全选,增加和删除等功能

    Android高级控件(一)--ListView绑定CheckBox实现全选,增加和删除等功能 这个控件还是挺复杂的,也是项目中应该算是比较常用的了,所以写了一个小Demo来讲讲,主要是自定义adap ...

随机推荐

  1. NET Portability Analyzer

    NET Portability Analyzer 分析迁移dotnet core 大多数开发人员更喜欢一次性编写好业务逻辑代码,以后再重用这些代码.与构建不同的应用以面向多个平台相比,这种方法更加容易 ...

  2. Android中通过访问本地相册或者相机设置用户头像

    目前几乎所有的APP在用户注册时都会有设置头像的需求,大致分为三种情况: (1)通过获取本地相册的图片,经过裁剪后作为头像. (2)通过启动手机相机,现拍图片然后裁剪作为头像. (3)在APP中添加一 ...

  3. 二师兄VPN加速器

    http://www.2-vpn2.org/home.action?ic=B003CC4C47

  4. 网站页面优化必然趋势—WebP 图片!

    本文梗概:众所周知,浏览器可以通过 HTTP 请求的 Accpet 属性 来指定接收的内容类型.依靠这个技术,可以在不修改任何 HTML/CSS 或者图片的情况下,向浏览器提供优化的图片,从而降低带宽 ...

  5. mytbatis配置多数据源

    http://blog.zous-windows.com/archives/207.html http://www.oschina.net/question/144055_141255?sort=ti ...

  6. Win7新建ftp快捷方式(原XP网上邻居中客户端图标)

      2014-6-2 XP逐渐隐退,新机器一般都是Win7或者Win8了.有很多朋友反映在这两个新系统中找不到类似XP网上邻居中的ftp链接图标.故稍微研究了下,以Win7为例,总结如下. 1.骨灰级 ...

  7. Maven 的安装配置

    Maven 的安装配置 一.在安装 Maven 之前,先确保JDK1.7及以上版本并且配置好环境变量. 二.下载maven的bin,在apache官方网站可以下载. 1.首先去官网下载 Maven:h ...

  8. JavaScript 判断对象是否为空

    /** **判断是否null *@param data */ function isNull(data) {     return (data == "" || data == u ...

  9. 20140708郑州培训第二题Impossible Game

    Impossible Game题目描述你发明了一个简单的单人电脑游戏.在开始游戏时,玩家必须输入一个长度为 K 的字符串,且这个字符串的元素只能为‘A’‘B’‘C’或者‘D’.每一种字符串都代表一种颜 ...

  10. HDU 5935 Car 【模拟】 (2016年中国大学生程序设计竞赛(杭州))

    Car Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...