WPF ListView với CheckBox và sự kiện check all Checkbox trong ListView

09/02/2023

Tham khảo mã nguồn phần XAML

<Grid>
        <ListView Name="ListCheckbox">
            <ListView.View>
                <GridView>
                    <GridViewColumn x:Name="gridClm_SelectRow" Width="30">
                        <CheckBox Name="chkSelectAll" Click="chkSelectAll_Click" />
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <CheckBox
                                    Name="cbSelectRow"                                  
                                    Checked="chkWspSelect_Checked"
                                    IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, 
                                    AncestorType={x:Type ListViewItem}}, Path=IsSelected}"
                                    IsThreeState="False"
                                    Unchecked="chkWspSelect_Unchecked" />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn DisplayMemberBinding="{Binding Path=ID}" Header="ID" />
                    <GridViewColumn DisplayMemberBinding="{Binding Path=Name}" Header="Name" />
                </GridView>
            </ListView.View>
        </ListView>
    </Grid>

Tham khảo mã nguồn phần Code

    /// <summary>
    /// Interaction logic for ListViewCheckBoxDemo.xaml
    /// </summary>
    public partial class ListViewCheckBoxDemo : Window
    {    
      
        public ListViewCheckBoxDemo()
        {
            InitializeComponent();
            Employees f_ep = new Employees();
            ListCheckbox.DataContext = null;
            ListCheckbox.ItemsSource = f_ep.List_EmployeesDefaull();
        }

        private void chkSelectAll_Click(object sender, RoutedEventArgs e)
        {
            if (chkSelectAll.IsChecked.Value == true)
            {
                ListCheckbox.SelectAll();
            }
            else
            {
                ListCheckbox.UnselectAll();
            }
        }

        private void chkWspSelect_Checked(object sender, RoutedEventArgs e)
        {
            ListBoxItem item = ItemsControl.ContainerFromElement(ListCheckbox, e.OriginalSource as DependencyObject) as ListBoxItem;
            if (item != null)
            {
                item.IsSelected = true;
            }
        }

        private static bool individualChkBxUnCheckedFlag { get; set; }
        private void chkWspSelect_Unchecked(object sender, RoutedEventArgs e)
        {
            ListBoxItem item = ItemsControl.ContainerFromElement(ListCheckbox, e.OriginalSource as DependencyObject) as ListBoxItem;
            if (item != null)
                item.IsSelected = false;

            individualChkBxUnCheckedFlag = true;
            CheckBox headerChk = (CheckBox)((GridView)ListCheckbox.View).Columns[0].Header;
            headerChk.IsChecked = false;
        }

    }

    public class Employees
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public Employees() { }
        public Employees(int id, string name)
        {
            ID = id;
            Name = name;
        }
        public List<Employees> List_EmployeesDefaull()
        {
            List<Employees> List_Items = new List<Employees>();

            List_Items.Add(new Employees(ID = 1, Name = "Đô rê mon"));
            List_Items.Add(new Employees(ID = 2, Name = "Nô bi ta"));
            List_Items.Add(new Employees(ID = 3, Name = "Xu ka"));
            List_Items.Add(new Employees(ID = 4, Name = "Chai en"));
            List_Items.Add(new Employees(ID = 5, Name = "Xê cô"));
            List_Items.Add(new Employees(ID = 6, Name = "Đê khi"));
            List_Items.Add(new Employees(ID = 7, Name = "Đô rê mi"));
            return List_Items;
        }
    }