WPF DataGrid:为动态首列单元格按数据上下文条件应用样式
解决WPF DataGrid首列特定条件单元格样式问题
我来帮你搞定这个需求!你想要的是仅当单元格位于当前首列(支持用户重排序列)且对应行的IsInEvidence为False时,才给单元格设置黄色背景,你的思路是对的,但绑定方式可以优化一下,让它更可靠:
问题分析
你原来的代码里,第二个条件用了FindAncestor去找DataGridCell,但当前Style的目标元素就是DataGridCell,用RelativeSource Mode=Self会更直接,也能避免潜在的绑定查找失败问题,这可能就是组合条件后没生效的核心原因。
修改后的完整代码
<DataGrid ItemsSource="{Binding Items}"> <DataGrid.CellStyle> <Style TargetType="DataGridCell"> <Style.Triggers> <MultiDataTrigger> <MultiDataTrigger.Conditions> <!-- 行级ViewModel的IsInEvidence属性为False --> <Condition Binding="{Binding IsInEvidence}" Value="False" /> <!-- 当前单元格所在列的DisplayIndex为0(即首列) --> <Condition Binding="{Binding Column.DisplayIndex, RelativeSource={RelativeSource Mode=Self}}" Value="0" /> </MultiDataTrigger.Conditions> <Setter Property="Background" Value="Yellow"/> </MultiDataTrigger> </Style.Triggers> </Style> </DataGrid.CellStyle> <!-- 你的列定义等内容 --> </DataGrid>
关键说明
- RelativeSource Mode=Self:直接绑定当前
DataGridCell的Column.DisplayIndex,比FindAncestor更高效准确——我们不需要向上查找祖先元素,当前元素就是目标。 - MultiDataTrigger的条件逻辑:只有当两个条件同时满足时(行数据
IsInEvidence为False,且单元格在首列),才会应用黄色背景样式,完全符合你的需求。 - 支持列重排:当用户拖动列改变顺序时,
Column.DisplayIndex会自动更新,样式会动态应用到新的首列中符合条件的单元格。
这个修改后应该就能正常工作了,你可以测试一下列重排的场景,看看样式是不是跟着首列走~
内容的提问来源于stack exchange,提问作者AgostinoX
相关产品推荐
相关产品推荐

