选定数据网格行的条件前景色

本文关键字:条件 前景色 网格 数据 数据网 | 更新日期: 2023-09-27 18:02:44

我有一个DataGrid绑定到一个CollectionViewSource正在从数据库填充。其中一些是"活动的",而另一些是"不活动的"。我希望非活动行具有不同的前景色,我已经设法做到了,但颜色不适用所选行。似乎System.HighlightTextBrushKey覆盖了任何改变高亮颜色的尝试。下面是用于非选中单元格的代码。

<DataGrid.Resources>
    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="{StaticResource ThemeHighlightColor}"/>
    <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="{StaticResource ThemeHighlightColor}"/>
    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black"/>
    <Style TargetType="{x:Type DataGridRow}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=active}" Value="False">
                <Setter Property="Foreground" Value="DarkOrchid"/>
                <Setter Property="FontWeight" Value="DemiBold"/>
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=active}" Value="True">
                <Setter Property="Foreground" Value="Black"/>
                <Setter Property="FontWeight" Value="Normal"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</DataGrid.Resources>

在上面的例子中,"非活动"行将采用DemiBold字体,即使被选中,但只有未被选中的行采用DarkOrchid颜色。相反,它们使用SystemColors.HighlightTextBrushKey颜色的黑色(即使我没有明确说明这一点,这些选定的行使用默认的SystemColors.HighlightTextBrushKey颜色的白色)。

我尝试使用MultiTrigger而不是上面的DataTriggers,但我有完全相同的问题(字体是粗体,但仍然是黑色)。这是MultiTrigger:

<MultiDataTrigger>
    <MultiDataTrigger.Conditions>
        <Condition Binding="{Binding Path=active}" Value="False"/>
        <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="True"/>
    </MultiDataTrigger.Conditions>
    <MultiDataTrigger.Setters>
        <Setter Property="Foreground" Value="DarkOrchid"/>
        <Setter Property="FontWeight" Value="DemiBold"/>
    </MultiDataTrigger.Setters>
</MultiDataTrigger>
我在任何地方都找不到解决这个问题的方法。是否有某种方法可以使选定行的前景色以某些绑定值为条件?

选定数据网格行的条件前景色

当我遇到这个问题时,我为单元格内容创建了一个样式(在我的情况下是TextBlock)。我把样式放在DataGrid.Resources中。在您的例子中,它看起来像:

<Datagrid.Resouces>
  <Style TargetType="{x:Type TextBlock}" x:Key="Text">
    <Style.Triggers>
      <DataTrigger Binding="{Binding Path=active}" Value="False">
        <Setter Property="Foreground" Value="DarkOrchid"/>
        <Setter Property="FontWeight" Value="DemiBold"/>
      </DataTrigger>
      <DataTrigger Binding="{Binding Path=active}" Value="True">
        <Setter Property="Foreground" Value="Black"/>
        <Setter Property="FontWeight" Value="Normal"/>
      </DataTrigger>
    </Style.Triggers>
  </Style>
</Datagrid.Resouces>

可以在每个单元格中使用它。这看起来像:

<DataGridTextColumn Header="Name" Binding="{Binding FirstName}" 
                    ElementStyle="{StaticResource Text}" />

为您拥有的每个列添加样式有点麻烦,但这将优先于DataGridSystem.HighlightTextBrushKey

顺便说一下,样式化每个TextBlock这种方式将保持前景色的所有条件,包括选定和鼠标悬停。如果你需要不同的前景色,那么你需要将它们添加到Style.Triggers集合中。