WPF DataGrid 如何正确将DataTrigger绑定到单元格数据源而非行数据源
绑定报错的核心原因
- WPF中
DataGridCell的默认DataContext是其所属行的行对象(即示例中的MyRow实例),不会自动指向单元格实际承载的业务对象(这里是MyCell实例)。 - 你在CellStyle中写的
{Binding IsOn}没有指定绑定源,会默认使用继承来的行级DataContext作为绑定源,因此系统才会去MyRow类型上查找IsOn属性。而MyRow本身没有定义这个属性,自然会触发“属性找不到”的绑定错误。 - 只要绑定没有主动修改源上下文,哪怕Style是写在单元格层面,也会沿用继承的行级数据上下文,和Style本身的定义位置没有直接关系。
正确绑定MyCell对象属性的实现方法
不需要修改现有类的结构,只需要调整CellStyle中DataTrigger的绑定逻辑,把绑定源从行级DataContext切换到当前单元格自身的属性即可:
- 利用
RelativeSource将绑定源指定为当前的DataGridCell元素本身,完全绕开继承来的行级DataContext - 自动生成列的
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
相关产品推荐
相关产品推荐

