如何将WPF DataGrid行IsSelected属性绑定到源IsChecked属性
实现步骤
直接通过重写DataGrid的行样式,将行的选中状态双向绑定到实体属性即可,全程不需要额外写后台逻辑。
XAML 代码配置
给你的DataGrid添加RowStyle节点,配置DataGridRow的IsSelected属性绑定:
<!-- 记得把ItemsSource的绑定路径替换成你自己的ViewModel中DeckInt列表的属性名 --> <DataGrid ItemsSource="{Binding DeckList}" SelectionMode="Extended" AutoGenerateColumns="False"> <!-- 你如果用自动生成列就设为True,手动定义列就保持False --> <!-- 核心绑定代码:行选中状态同步到实体IsChecked --> <DataGrid.RowStyle> <Style TargetType="DataGridRow"> <Setter Property="IsSelected" Value="{Binding IsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> </Style> </DataGrid.RowStyle> <!-- 手动定义列示例,自动生成列的话可以删掉这部分 --> <DataGrid.Columns> <DataGridTextColumn Header="编号" Binding="{Binding Id}" Width="100"/> <DataGridTextColumn Header="名称" Binding="{Binding Name}" Width="*"/> <DataGridCheckBoxColumn Header="选中" Binding="{Binding IsChecked}" Width="80"/> </DataGrid.Columns> </DataGrid>
关键说明
- 绑定必须设置
Mode=TwoWay:保证双向同步——界面点选行会修改实体IsChecked值,后台代码修改实体IsChecked也会自动同步行的选中状态 UpdateSourceTrigger=PropertyChanged可以让选中状态变化时立刻更新实体值,不需要等失去焦点- 如果需要支持多行选中,必须将DataGrid的
SelectionMode设为Extended或Multiple,默认Single模式下一次只能选中一行,会和多个实体IsChecked=true的状态冲突 - 你现有
DeckInt类的IsChecked属性已经正确实现了属性变更通知,不需要修改实体类的绑定相关代码
额外优化提示
你当前的
DeckInt类存在冗余公共属性:小写开头的id/name/isChecked都是公共自动属性,和大写开头带通知的属性重名,开启自动生成列时会多出3列重复数据。建议把这三个小写开头的属性改为私有字段,写法更规范:
public class DeckInt : INotifyPropertyChanged { private int _id; private string _name; private bool _isChecked; public int Id { get => _id; set { _id = value; OnPropertyChanged(nameof(Id)); } } /// <summary> /// Group name of the weight item /// </summary> public string Name { get => _name; set { _name = value; OnPropertyChanged(nameof(Name)); } } public bool IsChecked { get => _isChecked; set { _isChecked = value; OnPropertyChanged(nameof(IsChecked)); } } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
内容的提问来源于stack exchange,提问作者nihasmata
相关产品推荐
相关产品推荐

