2016-08-17 4 views
0

У меня есть DataGrid, связанный с CollectionViewSource, заполняемым из базы данных. Некоторые из этих элементов являются «активными», тогда как другие «неактивны». Я хотел бы, чтобы неактивные строки имели другой цвет переднего плана, который мне удалось сделать, но цвет не применяет выбранные строки. Кажется, что System.HighlightTextBrushKey переопределяет любые попытки изменения выделенного цвета. Вот код, который работает для не выбранных ячеек.Условный цвет переднего плана в выбранной строке DataGrid

<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 по умолчанию).

Я попытался использовать 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> 

Я не могу найти решение этого никуда. Есть ли способ сделать цвет переднего плана в выбранной строке условным для некоторого значения границы?

+0

Вы пытались настроить HighlightTextBrushKey на DarkOrchid в DataGrid.Resources? например: '' – sthotakura

+0

@sthotakura yes, но это изменяет все выбранные строки на Dark Orchid. Мне нужны только те строки, которые неактивны и выбраны. –

+0

Ах да, вы правы. – sthotakura

ответ

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 в DataGrid.

Кстати, стиль каждого TextBlock таким образом будет поддерживать цвет переднего плана для всех условий, включая выбранные и наложенные мыши. Если вам нужны разные цвета переднего плана для этих условий, вам нужно будет добавить их в коллекцию Style.Triggers.