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

WPF DataGrid中IsSelected无法覆盖DataTrigger的Foreground问题

解决WPF DataGrid选中行时TextBlock Foreground样式不生效的问题

问题原因

WPF样式触发器存在优先级规则:元素自身Style内的触发器优先级高于父元素(如DataGridRow)的Setter。你在DataGridRow的Style里设置了选中时的Foreground为白色,但TextBlock自己的Style通过DataTrigger定义了不同的Foreground值,后者会覆盖前者的设置,导致选中行时TextBlock文字颜色无法变为白色。

解决方案

在TextBlock的Style中添加一个MultiDataTrigger,明确判断「当前行选中且ViewPermission为True」的场景,设置对应的Foreground为白色。由于触发器的顺序会影响优先级,将这个MultiDataTrigger放在现有DataTrigger之后,确保它能覆盖之前的Foreground设置。

修改后的TextBlock Style代码如下:

<TextBlock TextDecorations="Underline" Text="{Binding Path=ClientName}">
    <TextBlock.Style>
        <Style TargetType="TextBlock">
            <Style.Triggers>
                <DataTrigger Binding="{Binding ViewPermission}" Value="False">
                    <Setter Property="IsEnabled" Value="False"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding ViewPermission}" Value="False">
                    <Setter Property="Foreground" Value="Gray"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding ViewPermission}" Value="True">
                    <Setter Property="FontWeight" Value="Bold"/>
                    <Setter Property="Foreground" Value="#0078d4" />
                </DataTrigger>
                <!-- 新增:判断行选中+ViewPermission为True的触发器 -->
                <MultiDataTrigger>
                    <MultiDataTrigger.Conditions>
                        <Condition Binding="{Binding ViewPermission}" Value="True" />
                        <Condition Binding="{Binding RelativeSource={RelativeSource AncestorType=DataGridRow}, Path=IsSelected}" Value="True" />
                    </MultiDataTrigger.Conditions>
                    <Setter Property="Foreground" Value="White" />
                </MultiDataTrigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Style>

    <TextBlock.InputBindings>
        <MouseBinding MouseAction="LeftClick" Command="{Binding Path=DataContext.RowClick,  RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" CommandParameter="{Binding}"></MouseBinding>
    </TextBlock.InputBindings>
</TextBlock>

额外优化

你可以把针对ViewPermission=False的两个DataTrigger合并成一个,简化代码:

<MultiDataTrigger>
    <MultiDataTrigger.Conditions>
        <Condition Binding="{Binding ViewPermission}" Value="False" />
    </MultiDataTrigger.Conditions>
    <Setter Property="IsEnabled" Value="False"/>
    <Setter Property="Foreground" Value="Gray"/>
</MultiDataTrigger>

修改后,当行被选中且ViewPermission为True时,TextBlock的Foreground会正确变为白色,同时保留了原有根据ViewPermission设置的样式逻辑。

内容的提问来源于stack exchange,提问作者PRI

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 15:57:21