Search code examples
c#wpfwpfdatagrid

How to Select All CheckBox of a Column by DataGrid Header CheckBox in WPF DataGrid


I have a DataGrid with one CheckBoxColumn. In the header of that CheckBoxColumn I have added a CheckBox to Select all CheckBoxes of that Datagrid Row.

How can I achieve that?

My XAML Code for WPF dataGrid:

    <DataGrid AutoGenerateColumns="False" CanUserAddRows="False"  Grid.RowSpan="2" Height="130" HorizontalAlignment="Left" IsReadOnly="False" Margin="189,340,0,0" Name="dgCandidate" TabIndex="7" VerticalAlignment="Top" Width="466" Grid.Row="1" >
        <DataGrid.Columns>
            <DataGridTextColumn x:Name="colCandidateID" Binding="{Binding CandidateID}" Header="SlNo" MinWidth="20" IsReadOnly="True" />
            <DataGridTextColumn x:Name="colRegistraion" Binding="{Binding RegisterNo}" Header="Reg. No." IsReadOnly="True"  />
            <DataGridTextColumn x:Name="colCandidate" Binding="{Binding CandidateName}" Header="Name" MinWidth="250" IsReadOnly="True"  />

            <DataGridTemplateColumn>
                <DataGridTemplateColumn.Header>
                    <CheckBox Name="chkSelectAll" Checked="chkSelectAll_Checked" Unchecked="chkSelectAll_Unchecked"></CheckBox>
                </DataGridTemplateColumn.Header>
                <DataGridTemplateColumn.CellTemplate >
                    <DataTemplate >
                        <CheckBox x:Name="colchkSelect1" Checked="colchkSelect1_Checked" Unchecked="colchkSelect1_Unchecked" ></CheckBox>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

        </DataGrid.Columns>

    </DataGrid>

Solution

  • Convert your Candidate class into something like this:

    public class Candidate : DependencyObject
    {
        //CandidateID Dependency Property
        public int CandidateID
        {
            get { return (int)GetValue(CandidateIDProperty); }
            set { SetValue(CandidateIDProperty, value); }
        }
        public static readonly DependencyProperty CandidateIDProperty =
            DependencyProperty.Register("CandidateID", typeof(int), typeof(Candidate), new UIPropertyMetadata(0));
        //RegisterNo Dependency Property
        public int RegisterNo
        {
            get { return (int)GetValue(RegisterNoProperty); }
            set { SetValue(RegisterNoProperty, value); }
        }
        public static readonly DependencyProperty RegisterNoProperty =
            DependencyProperty.Register("RegisterNo", typeof(int), typeof(Candidate), new UIPropertyMetadata(0));
        //CandidateName Dependency Property
        public string CandidateName
        {
            get { return (string)GetValue(CandidateNameProperty); }
            set { SetValue(CandidateNameProperty, value); }
        }
        public static readonly DependencyProperty CandidateNameProperty =
            DependencyProperty.Register("CandidateName", typeof(string), typeof(Candidate), new UIPropertyMetadata(""));
        //BooleanFlag Dependency Property
        public bool BooleanFlag
        {
            get { return (bool)GetValue(BooleanFlagProperty); }
            set { SetValue(BooleanFlagProperty, value); }
        }
        public static readonly DependencyProperty BooleanFlagProperty =
            DependencyProperty.Register("BooleanFlag", typeof(bool), typeof(Candidate), new UIPropertyMetadata(false));
    }
    

    in MainWindow.xaml:

    <DataGrid ItemsSource="{Binding CandidateList}">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Id" Binding="{Binding CandidateID}"/>
            <DataGridTextColumn Header="RegNr" Binding="{Binding RegisterNo}"/>
            <DataGridTextColumn Header="Name" Binding="{Binding CandidateName}"/>
            <DataGridTemplateColumn>
                <DataGridTemplateColumn.Header>
                    <CheckBox Checked="CheckBox_Checked" Unchecked="CheckBox_Checked"></CheckBox>
                </DataGridTemplateColumn.Header>
                <DataGridTemplateColumn.CellTemplate >
                    <DataTemplate>
                        <CheckBox IsChecked="{Binding BooleanFlag}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
    

    in MainWindow.xaml.cs:

        public MainWindow()
        {
            DataContext = this;
            CandidateList.Add(new Candidate()
            {
                CandidateID = 1,
                CandidateName = "Jack",
                RegisterNo = 123,
                BooleanFlag = true
            });
            CandidateList.Add(new Candidate()
            {
                CandidateID = 2,
                CandidateName = "Jim",
                RegisterNo = 234,
                BooleanFlag = false
            });
            InitializeComponent();
        }
        //List Observable Collection
        private ObservableCollection<Candidate> _candidateList = new ObservableCollection<Candidate>();
        public ObservableCollection<Candidate> CandidateList { get { return _candidateList; } }
        private void CheckBox_Checked(object sender, RoutedEventArgs e)
        {
            foreach (var item in CandidateList)
            {
                item.BooleanFlag = true;
            }
        }
        private void UnheckBox_Checked(object sender, RoutedEventArgs e)
        {
            foreach (var item in CandidateList)
            {
                item.BooleanFlag = false;
            }
        }