DataGridCell IsReadOnly触发器选中行失焦后背景色消失问题
问题:DataGrid非只读单元格选中失焦后自定义背景色消失
需求为当DataGrid列的IsReadOnly属性设为false时,为DataGridCell的ControlTemplate中的包裹Border设置对应颜色。初始状态下颜色设置正常,但选中某行后光标离开该行(该行仍处于选中状态)时,自定义着色消失,恢复为默认样式。
用户已编写的Style代码:
<Style BasedOn="{StaticResource MaterialDesignDataGridCell}" TargetType="{x:Type DataGridCell}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type DataGridCell}"> <Border Margin="8" Background="{TemplateBinding Background}" CornerRadius="4"> <Grid> <ContentPresenter VerticalAlignment="Center" /> </Grid> </Border> <ControlTemplate.Triggers> <Trigger Property="IsReadOnly" Value="False"> <Setter Property="Background" Value="{StaticResource SecondaryHueMidBrush}" /> <Setter Property="Foreground" Value="{StaticResource MaterialDesignDarkForeground}" /> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style>
非ReadOnly列定义:
<DataGridTextColumn Binding="{Binding PreviousMonthResult, UpdateSourceTrigger=PropertyChanged}" EditingElementStyle="{StaticResource textCenterEditing}" ElementStyle="{StaticResource textCenter}"> <DataGridTextColumn.HeaderTemplate> <DataTemplate> <Border Padding="8" Background="{StaticResource SecondaryHueMidBrush}" CornerRadius="8"> <TextBlock Foreground="{StaticResource MaterialDesignDarkForeground}" Text="{Binding DataContext.DateHeaders[PreviousMonth], RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" /> </Border> </DataTemplate> </DataGridTextColumn.HeaderTemplate> </DataGridTextColumn> <DataGridTextColumn Binding="{Binding CurrentMonthResult, UpdateSourceTrigger=PropertyChanged}" EditingElementStyle="{StaticResource textCenterEditing}" ElementStyle="{StaticResource textCenter}"> <DataGridTextColumn.HeaderTemplate> <DataTemplate> <Border Padding="8" Background="{StaticResource SecondaryHueMidBrush}" CornerRadius="8"> <TextBlock Foreground="{StaticResource MaterialDesignDarkForeground}" Text="{Binding DataContext.DateHeaders[CurrentMonth], RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" /> </Border> </DataTemplate> </DataGridTextColumn.HeaderTemplate> </DataGridTextColumn>
相关辅助样式:
<Style BasedOn="{StaticResource MaterialDesignDataGridColumnHeader}" TargetType="DataGridColumnHeader"> <Setter Property="HorizontalContentAlignment" Value="Center" /> </Style> <Style x:Key="textCenter" TargetType="{x:Type TextBlock}"> <Setter Property="TextAlignment" Value="Center" /> </Style> <Style x:Key="textCenterEditing" BasedOn="{StaticResource MaterialDesignTextBox}" TargetType="{x:Type TextBox}"> <Setter Property="TextAlignment" Value="Center" /> </Style>
原因分析
DataGridCell的选中状态样式优先级高于IsReadOnly触发器。当单元格处于选中(失焦后仍保持选中)状态时,默认的选中样式会覆盖通过IsReadOnly触发器设置的Background属性,导致自定义着色消失。
解决方案
在ControlTemplate的Triggers中添加针对IsSelected属性的多条件触发器,结合IsReadOnly的判断,确保非只读单元格在选中(包括失焦选中)状态下依然保留自定义背景色。
修改后的完整Style代码:
<Style BasedOn="{StaticResource MaterialDesignDataGridCell}" TargetType="{x:Type DataGridCell}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type DataGridCell}"> <Border Margin="8" Background="{TemplateBinding Background}" CornerRadius="4"> <Grid> <ContentPresenter VerticalAlignment="Center" /> </Grid> </Border> <ControlTemplate.Triggers> <!-- 基础非只读状态样式 --> <Trigger Property="IsReadOnly" Value="False"> <Setter Property="Background" Value="{StaticResource SecondaryHueMidBrush}" /> <Setter Property="Foreground" Value="{StaticResource MaterialDesignDarkForeground}" /> </Trigger> <!-- 处理选中(失焦仍保持选中)的非只读单元格 --> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="IsSelected" Value="True" /> <Condition Property="IsReadOnly" Value="False" /> </MultiTrigger.Conditions> <Setter Property="Background" Value="{StaticResource SecondaryHueMidBrush}" /> <Setter Property="Foreground" Value="{StaticResource MaterialDesignDarkForeground}" /> </MultiTrigger> <!-- 可选:区分选中且聚焦的状态,增强视觉反馈 --> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="IsSelected" Value="True" /> <Condition Property="IsKeyboardFocusWithin" Value="True" /> <Condition Property="IsReadOnly" Value="False" /> </MultiTrigger.Conditions> <Setter Property="Background" Value="{StaticResource SecondaryHueLightBrush}" /> <Setter Property="Foreground" Value="{StaticResource MaterialDesignDarkForeground}" /> </MultiTrigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style>
说明
- 新增的
MultiTrigger同时判断IsSelected和IsReadOnly两个条件,强制为选中的非只读单元格应用自定义背景色,覆盖默认选中样式。 - 可选的第二个
MultiTrigger用于区分选中且聚焦与选中但失焦的状态,提供更清晰的界面反馈,不需要可直接删除该部分。
内容的提问来源于stack exchange,提问作者James0n
相关产品推荐
相关产品推荐

