如何在WPF DataGrid选中行时单独修改指定单元格颜色?
解决DataGrid特定单元格选中样式独立设置的问题
你遇到的核心问题是DataGridCell的全局样式优先级高于列内的ElementStyle——你在DataGrid.Resources里定义的DataGridCell选中触发器,会直接覆盖列内ElementStyle的设置,毕竟Cell是TextBlock的父容器,它的背景会完全盖住子元素的样式。
要让"Expected Date"单元格在选中时显示粉红/浅红,你需要给这个列单独定义CellStyle,直接针对DataGridCell的选中状态做样式覆盖,这样就能突破全局样式的限制。
以下是修改后的完整代码:
<DataGrid x:Name="tblopenRequests" ItemsSource="{Binding}" Grid.Column="1" Grid.Row="2" IsReadOnly="true" RowHeaderWidth="0" AutoGenerateColumns="False" CanUserAddRows="False" SelectionMode="Single"> <DataGrid.Resources> <Style BasedOn="{StaticResource {x:Type DataGridColumnHeader}}" TargetType="{x:Type DataGridColumnHeader}" > <Setter Property="Background" Value="LightSeaGreen" /> <Setter Property="Foreground" Value="white" /> <Setter Property="BorderBrush" Value="Black"/> <Setter Property="BorderThickness" Value="1 1 1 1"/> <Setter Property="Margin" Value="-1,-1,0,0" /> <Setter Property="Height" Value="28" /> <Setter Property="Width" Value="auto"/> <Setter Property="HorizontalContentAlignment" Value="Center"/> </Style> <!-- 把全局Cell样式提取为带Key的可继承样式 --> <Style x:Key="DefaultDataGridCellStyle" TargetType="DataGridCell"> <Setter Property="HorizontalContentAlignment" Value="Right" /> <Style.Triggers> <Trigger Property="IsSelected" Value="True"> <Setter Property="Background" Value="Goldenrod" /> <Setter Property="BorderBrush" Value="white" /> <Setter Property="Foreground" Value="black" /> <Setter Property="FontWeight" Value="Bold" /> <Setter Property="FontSize" Value="15"/> </Trigger> </Style.Triggers> </Style> </DataGrid.Resources> <!-- 给DataGrid绑定默认Cell样式 --> <DataGrid.CellStyle> <StaticResource ResourceKey="DefaultDataGridCellStyle"/> </DataGrid.CellStyle> <!-- 修改后的Expected Date列 --> <DataGridTextColumn Binding="{Binding expectedDate}" Header="Expected Date" Width="90"> <DataGridTextColumn.ElementStyle> <Style TargetType="TextBlock"> <Setter Property="HorizontalAlignment" Value="Center" /> </Style> </DataGridTextColumn.ElementStyle> <!-- 为该列单独定义CellStyle,继承默认样式并修改选中背景 --> <DataGridTextColumn.CellStyle> <Style BasedOn="{StaticResource DefaultDataGridCellStyle}" TargetType="DataGridCell"> <Style.Triggers> <Trigger Property="IsSelected" Value="True"> <Setter Property="Background" Value="Pink" /> <!-- 字体、字号等其他选中样式会自动继承默认设置,无需重复写 --> </Trigger> </Style.Triggers> </Style> </DataGridTextColumn.CellStyle> </DataGridTextColumn> <!-- 其他列保持原有配置即可 --> <!-- ... --> </DataGrid>
关键细节说明:
- 我把全局的
DataGridCell样式提取成了带x:Key的可复用样式,方便其他列继承,也让特定列的修改更清晰。 - 目标列的
CellStyle通过BasedOn继承默认样式,只重写IsSelected触发器的Background属性——这样既保留了全局的选中字体样式,又单独替换了该单元格的背景色。 - 这样设置后,整行选中时,其他单元格还是金菊黄,只有"Expected Date"单元格会显示粉红,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Glenn Angel
相关产品推荐
相关产品推荐

