WPF中CheckBox的全选与反选

 DataGride中的CheckBox的全选与反选操作,该操作仅仅对复选框的选中状态进行了改变与绑定,但没有操作表格中的数据

前台XMAL代码:

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        xmlns:local="clr-namespace:WpfApp1" Loaded="getData">

    <DataGrid Name="dataGrid" Grid.Row="1" >
        <DataGrid.Columns>
            <DataGridTemplateColumn Header="选择">
                <DataGridTemplateColumn.HeaderTemplate>
                    <DataTemplate>
                        <CheckBox Click="CheckBox_Click_3" Name="heaChe"></CheckBox>
                    </DataTemplate>
                </DataGridTemplateColumn.HeaderTemplate>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <CheckBox VerticalAlignment="Center" Loaded="CheckBox_Loaded_1" Click="CheckBox_Click_1" HorizontalAlignment="Center"></CheckBox>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
     
</Window>

后台:

给DataGride 表格设置itemSource值

 private void getData(object sender, RoutedEventArgs e)
        {
            List<int> ids = new List<int>();
            ids.Add(1);
            ids.Add(3);
            ids.Add(4);
            ids.Add(5);
            ids.Add(6);
            ids.Add(7);
            dataGrid.ItemsSource = ids;
        }

 首先为了方便操作把checkBox控件先放到内存中缓存下来

 List<CheckBox> headerChecks = new List<CheckBox>();

 private void CheckBox_Loaded_1(object sender, RoutedEventArgs e)
        {
            CheckBox cbtemp = (CheckBox)sender;
            headerChecks.Add(cbtemp);
        }

 全选复选框的点击事件

 private void CheckBox_Click_3(object sender, RoutedEventArgs e)
        {
            CheckBox chb = GetVisualChild<CheckBox>(dataGrid, v => v.Name == "heaChe");
            if (chb.IsChecked == true)
            {
                //chb.IsChecked = false;
                headerChecks.ForEach(a => a.IsChecked = true);
            }
            else
            {
                //chb.IsChecked = false;
                headerChecks.ForEach(a => a.IsChecked = false);
            }
        }

 /// <summary>
        /// 泛型方法,从VisualTree一层层地查找并定位到给定名称(CheckBox)的元素
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="parent"></param>
        /// <param name="predicate"></param>
        /// <returns></returns>
        public T GetVisualChild<T>(DependencyObject parent, Func<T, bool> predicate) where T : Visual
        {
            int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
            for (int i = 0; i < numVisuals; i++)
            {
                DependencyObject v = (DependencyObject)VisualTreeHelper.GetChild(parent, i);
                T child = v as T;
                if (child == null)
                {
                    child = GetVisualChild<T>(v, predicate);
                    if (child != null)
                    {
                        return child;
                    }
                }
                else
                {
                    if (predicate(child))
                    {
                        return child;
                    }
                }
            }
            return null;
        }





猜你喜欢

转载自blog.csdn.net/qq_34811513/article/details/79217295
今日推荐