2009-05-07 8 views
8

Ho il seguente XAML utilizzato per visualizzare informazioni dettagliate su un elemento selezionato in una visualizzazione elenco. Voglio che il rettangolo mostri il colore delle informazioni standard dietro il testo tranne quando l'elemento selezionato rappresenta un messaggio di errore. Il codice qui sotto non funziona così com'è e mostra sempre il colore delle informazioni. Funziona perfettamente se non si specifica un valore Fill per l'elemento radice <Rectangle />.Come eseguire l'override di una proprietà associata a 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> 

Il frammento non riflette, ma il codice vero e proprio ha un bel paio di livelli di stato possibili per la gravità in modo da non voler definire un trigger per ogni possibile severità. La logica che voglio è "Usa il colore delle informazioni a meno che la gravità non sia un errore, quindi usa il rosso".

Sono sicuro di aver frainteso alcuni aspetti fondamentali di WPF ma non riesco a individuarlo. Qualcuno può indicarmi la giusta direzione in modo tale che i trigger di dati che specificherò sostituiranno il valore Fill esistente quando le loro condizioni sono vere?

risposta

10

Sei quasi arrivato. Invece di specificare il riempimento "predefinito" come attributo sul rettangolo, specificarlo nello stile:

<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

Sì, ha funzionato. Però ... puoi spiegare perché? Mi sembra che la proprietà Fill sul Rectangle sarebbe equivalente. –

+0

Non posso, no. Questo è solo per esperienza. Immagino che averlo impostato sull'oggetto stesso sovrascriva qualsiasi cosa all'interno di uno stile. –

Problemi correlati