• WPF DataGrid CheckBox 多选 反选 全选


    效果图

    实现此效果的必要关键是

    Style+DataTemplate

    关键代码:

       <Window.Resources>
            <DataTemplate x:Key="CheckBoxDataTemplate">
                <Grid>
                    <CheckBox
                                 Click="CheckBox_Checked"
                                  Uid="{Binding id}"
                                IsChecked="{Binding IsSelect , Mode=TwoWay}">
                    </CheckBox>
                </Grid>
            </DataTemplate>
          
            <Style x:Key="CheckBoxStyle" TargetType="{x:Type DataGridCell}">
                <Setter Property="ContentTemplate" Value="{StaticResource  CheckBoxDataTemplate}"/>
            </Style>
    
        </Window.Resources>
        <Grid>
            <DataGrid  x:Name="TST"  >
                <DataGrid.Columns>
                    <DataGridCheckBoxColumn CellStyle="{StaticResource  CheckBoxStyle}"  Header="选择">
                        <DataGridCheckBoxColumn.HeaderTemplate>
                            <DataTemplate>
                                <CheckBox Content="全选" Uid="-1" Click="CheckBox_Checked"/>
                            </DataTemplate>
                        </DataGridCheckBoxColumn.HeaderTemplate>
                    </DataGridCheckBoxColumn>
                    <DataGridTextColumn Width="15*" Header="顺序" Binding="{Binding id}" />
                </DataGrid.Columns >
            </DataGrid>
        </Grid>

    通过Style中的Setter来引入模板。

    模板中则是CheckBox。

    这样一来,DataGrid中的数据行的复选框也都可以触发事件了。

    那么,在头部中的复选框则是使用修改DataGridCheckBoxColumn.HeaderTemplate来实现头部的复选框。

    另外必要说明的是,你可以对绑定类使用INotifyPropertyChanged接口,并   ObservableCollection集合类。

    后台的绑定类:

     public class TEST : INotifyPropertyChanged
            {
                public event PropertyChangedEventHandler PropertyChanged;
                private bool? isSelect;
                public int id { get; set; }
                public bool? IsSelect
                {
                    get { return isSelect; }
                    set
                    {
                        isSelect = value; OnChanged(new PropertyChangedEventArgs("IsSelect"));
                    }
                }
    
                protected void OnChanged(PropertyChangedEventArgs arg)//具体方法
                {
                    PropertyChanged?.Invoke(this, arg);
                }
            }

    主要实现代码:

        ObservableCollection<TEST> ts = new ObservableCollection<TEST>();
    
            public MainWindow()
            {
                InitializeComponent();
    
                TST.AutoGenerateColumns = false;
    
                TST.CanUserAddRows = false;
                for (var i = 0; i < 100; i++)
                {
                    ts.Add(new TEST() { IsSelect = false, id = i });
                }
                TST.ItemsSource = ts;
    
            }
    
    
            private void CheckBox_Checked(object sender, RoutedEventArgs e)
            {
                var Check = (sender as CheckBox);
    
                var CUID = int.Parse(Check.Uid);
    
                //全选
                if (CUID==-1)
                {
                    foreach (var item in ts)
                        item.IsSelect = true;
                    Check.Uid = "-2";
                    return;
                }
                //全否选
                if (CUID==-2)
                {
                    foreach (var item in ts)
                        item.IsSelect = false;
                    Check.Uid = "-1";
                    return;
                }
    
                var IsSelcted = ts[CUID].IsSelect;
    
                ts[CUID].IsSelect = (IsSealed ? false : true);
    
                var IsSelects = from s in ts
                                where s.IsSelect == true
                                select s;
    
                if(IsSelects.Count()==5)
                {
                    var Text = String.Empty;
                    foreach (var ITEM in IsSelects)
                        Text += ITEM.id + " 
    ";
    
                    MessageBox.Show(Text);
                }
    
            }
  • 相关阅读:
    『转』VC 工具使用和调试方法
    『轉』WINCE下如何实现发短信
    『转』Fatal error: Call to undefined function curl_init
    『转』WinCE驱动程序的分类
    『轉』Windows CE下的串口通讯类
    『轉』VC 6.0 “fatal error LNK1104: cannot open file "mfc42u.lib"”问题解决
    水晶报表乱码中文乱码问题(收藏)
    水晶报表如何完美导出一个Excel表格(收藏)
    ASP.NET AJAX(开发代号Atlas)重要参考资源大收集
    表格排序
  • 原文地址:https://www.cnblogs.com/T-ARF/p/9638595.html
Copyright © 2020-2023  润新知