繁体   English   中英

所选DataGrid行上的条件前景色

[英]Conditional foreground color on selected DataGrid row

我有一个绑定到从数据库填充的CollectionViewSourceDataGrid 这些项目中的一些是“活动的”,而其他则是“无效的”。 我希望不活动的行具有另一种我已经设法完成的前景色,但是该颜色不应用选定的行。 似乎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}" />

向您所拥有的每个列中添加样式有点System.HighlightTextBrushKey ,但这将优先于DataGridSystem.HighlightTextBrushKey

顺便说一下,以这种方式设置每个TextBlock样式将使所有条件(包括选定条件和鼠标悬停条件)保持前景色。 如果在这些情况下需要不同的前景色,则需要将它们添加到Style.Triggers集合中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM