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 + " \n"; MessageBox.Show(Text); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!