Donnerstag, 23. Mai 2013

InverseBooleanConverter mit bool? Unterstützung

An manchen Stellen ist es notwendig einen boolischen Wert in WPF zu invertieren. Dafür bieten sich Converter an. Man erstellt einfach eine Klasse, die von IValueConverter ableitet und implementert die benötigten Methoden Convert und ConvertBack.
Mein InverseBooleanConverter berücksichtigt auch den Typ Nullable<bool>. Dies kann zum Beispiel für Checkboxen wichtig sein kein, wenn man die Property IsThreeState auf true gesetzt hat, um 3 States (true, false und null) abzubilden.

Folgend der Converter:
 public class InverseBooleanConverter : IValueConverter  
 {  
      public object Convert(object value, Type targetType, object parameter, CultureInfo culture)  
      {  
           return InverseValue(value, targetType);  
      }  
      public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)  
      {  
           return InverseValue(value, targetType);  
      }  
      private static object InverseValue(object value, Type targetType)  
      {  
           if (targetType != typeof(bool) && targetType != typeof(bool?))  
                throw new InvalidOperationException("The targetType must be a bool!");  
           if (value == null)  
                return null;  
           return !(bool)value;  
      }  
 }  

Und hier die Beispielview mit dem XAML Code.
 <StackPanel>  
      <StackPanel.Resources>  
           <wpf:InverseBooleanConverter x:Key="InverseBooleanConverter" />  
      </StackPanel.Resources>  
      <CheckBox x:Name="IsEnabled" IsChecked="True" HorizontalAlignment="Center" />  
      <TextBox Width="80" Height="20" IsEnabled="{Binding Path=IsChecked, ElementName=IsEnabled}">text 1</TextBox>  
      <TextBox Width="80" Height="20" IsEnabled="{Binding Path=IsChecked, ElementName=IsEnabled, Converter={StaticResource InverseBooleanConverter}}">text 2</TextBox>  
 </StackPanel>