2009-05-07 11 views
8

J'ai le XAML suivant utilisé pour afficher des informations détaillées sur un élément sélectionné dans une vue de liste. Je souhaite que le rectangle affiche la couleur d'information standard derrière le texte, sauf si l'élément sélectionné représente un message d'erreur. Le code ci-dessous ne fonctionne pas tel quel et affiche toujours la couleur info. Cela fonctionne très bien si je ne spécifie pas Fill pour l'élément racine <Rectangle />.Comment puis-je remplacer une propriété liée avec un DataTrigger?

<Rectangle Fill="{DynamicResource {x:Static SystemColors.InfoBrushKey}}" 
      RadiusX="4" RadiusY="4"> 
    <Rectangle.Style> 
    <Style TargetType="{x:Type Rectangle}"> 
     <Style.Triggers> 
     <DataTrigger Binding="{Binding Path=CurrentMessage.Severity" 
        Value="Error" > 
      <Setter Property="Fill" Value="#20FF0000" /> 
     </DataTrigger> 
     </Style.Triggers> 
    </Style> 
    </Rectangle.Style> 
</Rectangle> 

L'extrait ne reflète pas, mais le code réel a tout à fait quelques niveaux d'état possibles pour la gravité Je ne veux pas définir un déclencheur pour chaque gravité possible. La logique que je veux est "Utiliser la couleur d'info sauf si la gravité est une erreur, puis utiliser le rouge".

Je suis sûr que j'ai mal compris certains aspects fondamentaux de WPF, mais je n'arrive pas à l'identifier. Quelqu'un peut-il me diriger dans la bonne direction afin que les déclencheurs de données que je spécifie remplaceront la valeur Fill existante quand leurs conditions sont vraies?

Répondre

10

Vous y êtes presque. Au lieu de spécifier le remplissage "par défaut" comme un attribut sur votre rectangle, spécifiez-le dans le style:

<Rectangle RadiusX="4" RadiusY="4"> 
    <Rectangle.Style> 
    <Style TargetType="{x:Type Rectangle}"> 
     <Setter Property="Fill" 
       Value="{DynamicResource {x:Static SystemColors.InfoBrushKey}}" /> 
     <Style.Triggers> 
     <DataTrigger Binding="{Binding Path=CurrentMessage.Severity" 
        Value="Error" > 
      <Setter Property="Fill" Value="#20FF0000" /> 
     </DataTrigger> 
     </Style.Triggers> 
    </Style> 
    </Rectangle.Style> 
</Rectangle> 
+0

Oui, cela a fonctionné. Bien que ... pouvez-vous expliquer pourquoi? Il me semble que la propriété Fill sur le Rectangle serait équivalente. –

+0

Je ne peux pas, non. C'est juste de l'expérience. Je suppose que l'avoir placé sur l'objet lui-même remplace tout ce qui se trouve dans un style. –