2016-08-17 1 views
0

J'ai un DataGrid lié à un CollectionViewSource qui est rempli à partir d'une base de données. Certains de ces éléments sont "actifs" tandis que d'autres sont "inactifs". Je voudrais que les lignes inactives aient une couleur de premier plan différente, ce que j'ai réussi à faire, mais la couleur n'applique pas les lignes sélectionnées. Il semble que le System.HighlightTextBrushKey annule toute tentative de modification de la couleur en surbrillance. Voici le code qui fonctionne pour les cellules non sélectionnées.Couleur de premier plan conditionnelle sur la ligne DataGrid sélectionnée

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

Dans le cas ci-dessus, les lignes « inactifs » prendront la police DemiBold, même si elle est sélectionnée, mais seulement des lignes non sélectionnées prendre la couleur DarkOrchid. Au lieu de cela, ils utilisent la couleur SystemColors.HighlightTextBrushKey de noir (même si je ne le dis pas explicitement, ces lignes sélectionnées utilisent la couleur SystemColors.HighlightTextBrushKey par défaut).

J'ai essayé d'utiliser un MultiTrigger au lieu du DataTriggers ci-dessus mais j'ai exactement le même problème (la police est en gras, mais reste noire). Voici le 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> 

Je ne peux pas trouver une solution à ce partout. Est-il possible de rendre la couleur de premier plan sur une ligne sélectionnée conditionnelle à une valeur liée?

+0

Avez-vous essayé de définir HighlightTextBrushKey à DarkOrchid dans DataGrid.Resources? comme ceci: '' – sthotakura

+0

@sthotakura oui, mais cela change toutes les lignes sélectionnées à Dark Orchid. Je ne veux que les lignes inactives ET sélectionnées. –

+0

Ah oui, vous avez raison. – sthotakura

Répondre

0

Lorsque j'ai rencontré ce problème, j'ai créé un style pour le contenu de la cellule (un TextBlock dans mon cas). J'ai placé le style dans le DataGrid.Resources. Dans votre cas, il ressemblerait à quelque chose comme:

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

De là, vous pouvez l'utiliser dans chaque cellule. Cela ressemblerait à quelque chose comme:

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

Il est un peu d'une douleur à ajouter un style à chacune des colonnes que vous avez, mais cela prendra priorité sur la System.HighlightTextBrushKey du DataGrid. Par ailleurs, le style de chaque TextBlock de cette façon gardera la couleur de premier plan pour toutes les conditions, y compris sélectionné et avec la souris. Si vous avez besoin de couleurs de premier plan différentes pour ces conditions, vous devrez les ajouter à la collection Style.Triggers.