Supponiamo di avere una Window WPF, contentente un singolo controllo TextBox. Vogliamo, senza utilizzare il code-behind, che a secondo del contenuto del TextBox, questo cambi il colore di background. Nello specifico, se nel TextBox c'è scritto "SI", il Background deve essere Verde, se c'è scritto "NO" rosso. Piccola prefazione: uno Style, è generalmente un'insieme di proprietà che applicato ad un'insieme di contenuti quali testi o immagini, ne determina l'aspetto grafico. Parlando di Style, in WPF, questo non è solo un semplice insieme di proprietà, dato che, include comportamenti specifici come la possibilità di cambiare l'aspetto di un controllo basandosi sugli eventi dell'utente, utilizzando gli event trigger. Per lo scopo del post, utilizzeremo invece dei Property Triggers, ovvero dei Trigger, che "osservano" una particolare Dependency Property per verificare se assume un certo valore. Nel caso in cui, il valore "osservato" sia quello atteso, si può impostare una qualche proprietà del controllo Target, ad esempio il Background o il testo del ToolTip.
Aggiungiamo il codice del nostro Style personalizzato alla collezione delle risorse presenti nella Window:
1 <Style x:Key="CustomTextBoxStyle" TargetType="{x:Type TextBox}">
2 <Style.Triggers>
3 <Trigger Property="Text" Value="SI">
4 <Setter Property="Background" Value="Green" />
5 <Setter Property="ToolTip" Value="Il valore SI è corretto"/>
6 </Trigger>
7 <Trigger Property="Text" Value="NO">
8 <Setter Property="Background" Value="Red" />
9 </Trigger>
10 </Style.Triggers>
11 </Style>
Il codice su esposto è relativamente semplice: in entrambi i trigger andiamo a monitorare la proprietà Text del controllo TextBox. Se questo assume il valore "SI" (case-sensitive), impostiamo la proprietà Background del controllo su Green ed il testo da visualizzare con il ToolTip. Se invece Text è uguale a "NO" allora impostiamo il colore di Background su Red.
Il codice XAML della Window è il seguente:
1 [...]
2 <Grid>
3 <Grid.RowDefinitions>
4 <RowDefinition Height="117*" />
5 <RowDefinition Height="145*" />
6 </Grid.RowDefinitions>
7 <TextBox Margin="66,48,77,30" Name="textBox1" Style="{StaticResource CustomTextBoxStyle}" />
8 </Grid>
9 </Window>
Supponiamo invece, di voler cambiare il valore del Background sul Giallo, quando si verificano più condizioni contemporaneamente, ad esempio quando il controllo TextBox ha il Focus e non contiene Testo. Per questo scopo utilizziamo invece un MultiTrigger:
1 <MultiTrigger>
2 <MultiTrigger.Conditions>
3 <Condition Property="Text" Value=""/>
4 <Condition Property="IsFocused" Value="True"/>
5 </MultiTrigger.Conditions>
6 <Setter Property="Background" Value="Yellow"/>
7 </MultiTrigger>
Codice XAML completo della Window WPF.