You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 00:14:54