WPF DataGrid:使用触发器更改单元格前景色

时间:2016-04-11 16:24:44

标签: c# wpf datagrid

我有一个WPF DataGrid,其中有一些列需要包含蓝色文本。这是按规范,不能更改。

现在,这通常不会成为问题,但是当用户在网格中选择一行时,该行会以蓝色突出显示,就像所有版本的Windows中一样。

这是有问题的,因为行变得难以阅读:

enter image description here

(请注意,上面的图片来自Win10,其中选择的蓝色很轻,但在客户端的机器上,即Windows Server 2008,“选择蓝色”更暗,文本基本上不可读)< / p>

所以我尝试将以下样式应用于该特定列的单元格:

<Style TargetType="DataGridCell" x:Key="styleBlueCell">
    <Style.Triggers>
        <Trigger Property="IsSelected" Value="False">
            <Setter Property="Foreground" Value="Blue"/>
        </Trigger>
        <Trigger Property="IsSelected" Value="True">
            <Setter Property="Foreground" Value="White"/>
        </Trigger>
    </Style.Triggers>
</Style>

这完全可以几乎 ......但对于一个场景:当一行被选中但DataGrid本身没有焦点时,该行变为灰色,这会让事情变得混乱:

enter image description here

我试图搞乱MultiTriggers,就像这样:

<Style TargetType="DataGridCell" x:Key="styleBlueCell2">
            <Style.Triggers>
                <MultiDataTrigger>
                    <MultiDataTrigger.Conditions>
                        <Condition Binding="{Binding ElementName=gridAvanzamenti, Path=IsFocused}" Value="False"/>
                        <Condition Binding="{Binding IsSelected}" Value="True" />
                    </MultiDataTrigger.Conditions>
                    <Setter Property="Foreground" Value="Blue"/>
                </MultiDataTrigger>
            </Style.Triggers>
        </Style>

但无论我尝试什么(按元素名称绑定,找到祖先等)我似乎无法绑定到父DataGrid。有谁知道怎么做?

1 个答案:

答案 0 :(得分:2)

经过更多的试验和错误以及来自Ed Plunkett的有用提示后,heeres完整的解决方案:

<Style TargetType="DataGridCell" x:Key="styleBlueCell">
    <Style.Setters>
        <Setter Property="Foreground" Value="Blue"/>
    </Style.Setters>
    <Style.Triggers>
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=IsKeyboardFocusWithin}" Value="True"/>
                <Condition Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}, Path=IsSelected}" Value="True"/>
            </MultiDataTrigger.Conditions>
            <Setter Property="Foreground" Value="White"/>
        </MultiDataTrigger>
    </Style.Triggers>
</Style>