You need to enable JavaScript to run this app. WPF DataGrid 如何正确将DataTrigger绑定到单元格数据源而非行数据源
优惠活动
大模型
产品
解决方案
定价
更多

WPF DataGrid 如何正确将DataTrigger绑定到单元格数据源而非行数据源

绑定报错的核心原因

  • WPF中DataGridCell的默认DataContext是其所属行的行对象(即示例中的MyRow实例),不会自动指向单元格实际承载的业务对象(这里是MyCell实例)。
  • 你在CellStyle中写的{Binding IsOn}没有指定绑定源,会默认使用继承来的行级DataContext作为绑定源,因此系统才会去MyRow类型上查找IsOn属性。而MyRow本身没有定义这个属性,自然会触发“属性找不到”的绑定错误。
  • 只要绑定没有主动修改源上下文,哪怕Style是写在单元格层面,也会沿用继承的行级数据上下文,和Style本身的定义位置没有直接关系。

正确绑定MyCell对象属性的实现方法

不需要修改现有类的结构,只需要调整CellStyle中DataTrigger的绑定逻辑,把绑定源从行级DataContext切换到当前单元格自身的属性即可:

  1. 利用RelativeSource将绑定源指定为当前的DataGridCell元素本身,完全绕开继承来的行级DataContext
  2. 自动生成列的DataGridCell自带的Content属性,存储的就是当前列绑定返回的MyCell实例,直接读取Content下的IsOn属性就能拿到正确值

修改后的CellStyle代码:

<DataGrid.CellStyle>
    <Style TargetType="{x:Type DataGridCell}">
        <Setter Property="Background" Value="PaleGreen" />
        <Style.Triggers>
            <DataTrigger 
                Binding="{Binding Path=Content.IsOn, RelativeSource={RelativeSource Self}}" 
                Value="True">
                <Setter Property="Background" Value="Red"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</DataGrid.CellStyle>

适配场景说明

  • 该写法全局生效,不需要为每一列单独编写重复Style,完美适配你当前开启AutoGenerateColumns的使用场景。
  • Content是DataGridCell的固有依赖属性,存储的就是列绑定返回的原始值,不会随列的渲染模板变化丢失,兼容性稳定。
  • 后续如果改为手动定义列,只要列绑定的返回值是MyCell类型,这个绑定逻辑不需要任何调整即可正常工作。

内容的提问来源于stack exchange,提问作者plasmobit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 18:54:03