WPF实现DataGrid选中行复选框批量勾选及联动勾选
WPF DataGrid 批量勾选与联动勾选解决方案
问题1:选中多行后批量勾选复选框
实现步骤:
- 实现RelayCommand命令类(用于绑定按钮操作)
public class RelayCommand : ICommand { private readonly Action _execute; private readonly Func<bool> _canExecute; public event EventHandler CanExecuteChanged { add => CommandManager.RequerySuggested += value; remove => CommandManager.RequerySuggested -= value; } public RelayCommand(Action execute, Func<bool> canExecute = null) { _execute = execute ?? throw new ArgumentNullException(nameof(execute)); _canExecute = canExecute; } public bool CanExecute(object parameter) => _canExecute?.Invoke() ?? true; public void Execute(object parameter) => _execute(); }
- 在ViewModel中添加批量勾选命令
// 假设实体类为DrawingItem,集合为ObservableCollection<DrawingItem> public ObservableCollection<DrawingItem> MyListCollection { get; set; } public ICommand BatchCheckCommand { get; } public YourViewModel() { MyListCollection = new ObservableCollection<DrawingItem>(); BatchCheckCommand = new RelayCommand(BatchCheckSelectedRows); } private void BatchCheckSelectedRows() { // 遍历所有选中的行,设置复选框为勾选状态 foreach (var item in MyListCollection.Where(item => item.IsSelected)) { item.IsChecked = true; } }
- 在XAML中添加绑定命令的按钮
在DataGrid同级位置添加按钮:
<Button Content="批量勾选选中行" Command="{Binding BatchCheckCommand}" Margin="10"/>
操作方式:选中DataGrid中的多行,点击按钮即可批量勾选这些行的复选框。
问题2:勾选S501时自动勾选已选中的S601、S701
实现步骤:
- 完善DrawingItem的INotifyPropertyChanged实现
public class DrawingItem : INotifyPropertyChanged { public string drawingNumber { get; set; } bool isChecked; bool isSelected; public bool IsSelected { get { return this.isSelected; } set { this.Set(() => IsSelected, ref isSelected, value); } } public bool IsChecked { get { return this.isChecked; } set { this.Set(() => IsChecked, ref isChecked, value); } } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } protected bool Set<T>(Expression<Func<T>> propertyExpression, ref T field, T value) { if (EqualityComparer<T>.Default.Equals(field, value)) return false; field = value; var propertyName = ((MemberExpression)propertyExpression.Body).Member.Name; OnPropertyChanged(propertyName); return true; } }
- 在ViewModel中监听集合项的属性变更
public YourViewModel() { MyListCollection = new ObservableCollection<DrawingItem>(); // 订阅集合变更事件,为新项绑定属性变更监听 MyListCollection.CollectionChanged += MyListCollection_CollectionChanged; BatchCheckCommand = new RelayCommand(BatchCheckSelectedRows); } private void MyListCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { if (e.NewItems != null) { foreach (DrawingItem item in e.NewItems) { item.PropertyChanged += DrawingItem_PropertyChanged; } } if (e.OldItems != null) { foreach (DrawingItem item in e.OldItems) { item.PropertyChanged -= DrawingItem_PropertyChanged; } } } private void DrawingItem_PropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName != nameof(DrawingItem.IsChecked)) return; var currentItem = sender as DrawingItem; // 检查当前项是S501且已被勾选 if (currentItem?.drawingNumber == "S501" && currentItem.IsChecked) { // 找到所有已选中的S601、S701并勾选 var targetItems = MyListCollection.Where(item => item.IsSelected && (item.drawingNumber == "S601" || item.drawingNumber == "S701")); foreach (var item in targetItems) { item.IsChecked = true; } } }
操作方式:先选中S601和S701的行,再勾选S501的复选框,此时已选中的S601、S701的复选框会自动被勾选。
内容的提问来源于stack exchange,提问作者Momo0204
相关产品推荐
相关产品推荐

