WPF: Binding tra proprietà negate dei controlli
Chi di voi ha avuto la possibilità di saggiare le gustosissime potenzialità di binding di WPF (di cui presto il nostro Marco Savarese parlerà nei suoi articoli) si sarà sicuramente accorto che il concetto di binding è molto generalizzato, tanto che è possibile bindare tra di loro proprietà dei controlli della stessa pagina. Se ad esempio volessimo che una textbox sia abilitata in base al fatto che una checkbox sia Checked o meno, possiamo fare:
<CheckBox x:Name="AbilitaCheckBox" IsChecked="True" />
<TextBox IsEnabled="{Binding ElementName=AbilitaCheckBox, Path=IsChecked}" Text="" />
Potremmo avere un piccolo problema se invece volessimo che la textbox si disabiliti quando la checkbox è Checked! In questo caso basta implementare una piccola classe di conversione:
public class NotConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { return !(bool)value; }
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { return !(bool )value;}
}
Il fatto che implementi l'interfaccia IValueConverter permette di utilizzare questa logica di conversione direttamente nello XAML, importando opportunamente il namespace (che, in questo caso in cui la cosa potrebbe interessare tutta l'applicazione, di fare nell'App.XAML):
xmlns:c="clr-namespace:MioNamespace"
<Application.Resources>
<c:NotConverter x:Key="notConverter"/>
...
</Application.Resources>
A questo punto basta modificare il binding tra i controlli in questo modo:
<CheckBox x:Name="AbilitaCheckBox" IsChecked="True" />
<TextBox IsEnabled="{Binding ElementName=AssenteCheckBox, Path=IsChecked, Converter={StaticResource notConverter} }" Text="" />
Naturalmente visto come abbiamo implementato la cosa possiamo fare qualsiasi tipo di conversione, basta scrivere una classicina che implementi l'interfaccia IValueConverter.
Spero vi sia utile
Happy Coding!!!