datagrid 绑定选中数据,列头全选

成品图:

xaml代码

<Grid>
        <DataGrid x:Name="datagrid" Height="Auto" Width="Auto" Grid.Row="1"
                  AutoGenerateColumns="False" 
                  CanUserAddRows="False"
                  CanUserDeleteRows="False" 
                  CanUserReorderColumns="False" 
                  CanUserResizeColumns="False" >
            <DataGrid.RowStyle>
                <Style  TargetType="DataGridRow">
                    <EventSetter Event="GotFocus" Handler="Item_GotFocus"/>
                </Style>
            </DataGrid.RowStyle>
            <DataGrid.Columns>
                <DataGridCheckBoxColumn Header="全选" Binding="{Binding IsSelected,Mode=TwoWay}">
                    <DataGridCheckBoxColumn.HeaderTemplate>
                        <DataTemplate>
                            <CheckBox Name="cbCheck" IsChecked="{Binding ElementName=root,Path=CheckboxIsSelected}" Content="选择" Width="60" Click="cbCheck_Click"/>
                        </DataTemplate>
                    </DataGridCheckBoxColumn.HeaderTemplate>
                </DataGridCheckBoxColumn>
                <DataGridTextColumn Header="名字" Binding="{Binding Name}"/>
                <DataGridTextColumn Header="性别" Binding="{Binding Sex}"/>
                <DataGridTextColumn Header="年龄" Binding="{Binding Age}"/>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>

cs代码

        /// <summary>
        /// 设置数据源
        /// </summary>
        void SetItemsSource()
        {
            List<Person> list = new List<Person>();
            for (int i = 0; i < 10; i++)
            {
                list.Add(new Person() { Name = "" + i, Age = "1" + i, Sex = i % 3 == 0 ? "男" : "女" });
            }
            datagrid.ItemsSource = list;
        }
        int selectedCount = 0;
        /// <summary>
        /// 绑定列头的勾选框
        /// </summary>
        public bool? CheckboxIsSelected
        {
            get { return (bool?)GetValue(CheckboxIsSelectedProperty); }
            set { SetValue(CheckboxIsSelectedProperty, value); }
        }
        public static readonly DependencyProperty CheckboxIsSelectedProperty =
            DependencyProperty.Register("CheckboxIsSelected", typeof(bool?), typeof(MainWindow), new PropertyMetadata(false));
        /// <summary>
        /// 选中列自动勾选勾选框
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Item_GotFocus(object sender, RoutedEventArgs e)
        {
            var item = (DataGridRow)sender;
            var ss = item.Item as Person;
            if (ss != null)
            {
                ss.IsSelected = !ss.IsSelected;
                selectedCount += ss.IsSelected ? 1 : -1;
                //if(ss.IsSelected)
                //{
                //    ss.IsSelected = false;
                //    selectedCount--;
                //}
                //else
                //{
                //    ss.IsSelected = true;
                //    selectedCount++;
                //}
            }
            CheckboxIsSelected = selectedCount > 0 ? selectedCount == datagrid.Items.Count ? true : (bool?)null : false;
            //if (selectedCount > 0)
            //{
            //    if (selectedCount == datagrid.Items.Count)
            //    {
            //        CheckboxIsSelected = true;
            //    }
            //    else
            //    {
            //        CheckboxIsSelected = null;
            //    }
            //}
            //else
            //{
            //    CheckboxIsSelected = false;
            //}
        }
        /// <summary>
        /// 全选和反选
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void cbCheck_Click(object sender, RoutedEventArgs e)
        {
            var items = datagrid.ItemsSource as List<Person>;
            if (items != null)
            {
                var result = (sender as CheckBox).IsChecked == true ? true : false;
                items.ForEach(s => s.IsSelected = result);
            }
        }

model代码

public class Person : ViewModelBase
    {
        private bool _IsSelected;
        /// <summary>
        /// 
        /// </summary>
        public bool IsSelected
        {
            get { return _IsSelected; }
            set
            {
                _IsSelected = value;
                RaisePropertyChanged("IsSelected");
            }
        }
        private string _Name;

        public string Name
        {
            get { return _Name; }
            set
            {
                _Name = value;
                RaisePropertyChanged("Name");
            }
        }
        private string _Age;

        public string Age
        {
            get { return _Age; }
            set
            {
                _Age = value;
                RaisePropertyChanged("Age");
            }
        }
        private string _Sex;

        public string Sex
        {
            get { return _Sex; }
            set
            {
                _Sex = value;
                RaisePropertyChanged("Sex");
            }
        }
    }

ViewModelBase

public class ViewModelBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        public void RaisePropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
原文地址:https://www.cnblogs.com/zbfamily/p/9341646.html