【问题标题】:Conditional foreground color on selected DataGrid row选定 DataGrid 行上的条件前景色
【发布时间】:2016-12-24 12:26:25
【问题描述】:

我有一个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>

我在任何地方都找不到解决方案。有什么方法可以使选定行的前景色以某个绑定值为条件?

【问题讨论】:

  • 您是否尝试在 DataGrid.Resources 中将 HighlightTextBrushKey 设置为 DarkOrchid?像这样:&lt;SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="DarkOrchid"/&gt;
  • @sthotakura 是的,但这会将所有选定的行更改为 Dark Orchid。我只想要处于非活动状态并被选中的行。
  • 啊,是的,你是对的。

标签: c# wpf datagrid selected foreground


【解决方案1】:

当我遇到这个问题时,我为单元格内容创建了一个样式(在我的例子中是 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 集合中。

【讨论】:

    猜你喜欢
    • 2012-07-10
    • 1970-01-01
    • 2013-01-30
    • 2012-11-05
    • 2020-02-28
    • 2023-01-16
    • 2012-02-12
    • 2012-02-15
    • 2016-05-22
    相关资源
    最近更新 更多