所选DataGrid行

时间:2016-08-17 18:07:18

标签: c# wpf datagrid selected foreground

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

在上述情况下,&#34;无效&#34;行将采用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>

我无法在任何地方找到解决方案。有没有办法让某个选定行的前景色以某个绑定值为条件?

1 个答案:

答案 0 :(得分:0)

当我遇到这个问题时,我为单元格内容创建了一个样式(在我的情况下为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}" />

为每个列添加样式会有点痛苦,但这会优先于System.HighlightTextBrushKey的{​​{1}}。

顺便说一下,通过这种方式为每个DataGrid设置风格将保留包括所选条件和鼠标悬停在内的所有条件的前景色。如果您需要针对这些条件使用不同的前景色,则需要将它们添加到TextBlock集合中。