You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 17:27:32