2009-06-03 8 views
32

Ich habe eine WPF-XAML-Datei, die einen Abschnitt einer GUI beschreibt, und ich möchte, dass das Aktivieren/Deaktivieren eines bestimmten Steuerelements von zwei anderen abhängt. Der Code sieht so etwas wie dies im Moment:C# WPF IsEnabled mit mehreren Bindungen?

<ComboBox Name="MyComboBox" 
      IsEnabled="{Binding ElementName=SomeCheckBox, Path=IsChecked}"/> 

Aber ich mag es auch auf einem anderen Checkbox abhängig sein, so etwas wie:

<ComboBox Name="MyComboBox" 
      IsEnabled="{Binding ElementName=SomeCheckBox&AnotherCheckbox, Path=IsChecked}"/> 

was den besten Weg ist, darüber zu gehen ? Ich kann mir nicht helfen zu fühlen, dass ich etwas Offensichtliches verpasse oder in die falsche Richtung gehe?

Antwort

54

Sie ein MultiBinding mit einem Konverter verwenden kann, die IMultiValueConverter implementiert.

nur eine Antwort geben können Sie (fast) kopieren & Paste:

Statische Ressource benötigt:

<converterNamespace:BooleanAndConverter x:Key="booleanAndConverter" /> 

Die ComboBox:

<ComboBox Name="MyComboBox"> 
    <ComboBox.IsEnabled> 
    <MultiBinding Converter="{StaticResource booleanAndConverter}"> 
     <Binding ElementName="SomeCheckBox" Path="IsChecked" /> 
     <Binding ElementName="AnotherCheckbox" Path="IsChecked" /> 
    </MultiBinding> 
    </ComboBox.IsEnabled> 
</ComboBox> 

Der Code für den Konverter:

namespace ConverterNamespace 
{ 
    public class BooleanAndConverter : IMultiValueConverter 
    { 
     public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      foreach (object value in values) 
      { 
       if ((value is bool) && (bool)value == false) 
       { 
        return false; 
       } 
      } 
      return true; 
     } 
     public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) 
     { 
      throw new NotSupportedException("BooleanAndConverter is a OneWay converter."); 
     } 
    } 
} 
+0

ich eine Frage, was passiert, wenn Werte null ist ? Ist es nicht besser, einen solchen Check am Anfang zu haben: 'if (Werte == null) { return false; } ' ? – Devid

7

Sie können auch kürzere Version des gleichen versuchen:

public class BooleanAndConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return values.OfType<IConvertible>().All(System.Convert.ToBoolean); 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 
} 

public class BooleanOrConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return values.OfType<IConvertible>().Any(System.Convert.ToBoolean); 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 
} 

und natürlich, Sie die Konverter für Sichtbarkeit müssen auch:

public class BooleanOrToVisibilityConverter : IMultiValueConverter 
{ 
    public Visibility HiddenVisibility { get; set; } 

    public bool IsInverted { get; set; } 

    public BooleanOrToVisibilityConverter() 
    { 
     HiddenVisibility = Visibility.Collapsed; 
     IsInverted = false; 
    } 

    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     bool flag = values.OfType<IConvertible>().Any(System.Convert.ToBoolean); 
     if (IsInverted) flag = !flag; 
     return flag ? Visibility.Visible : HiddenVisibility; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

public class BooleanAndToVisibilityConverter : IMultiValueConverter 
{ 
    public Visibility HiddenVisibility { get; set; } 

    public bool IsInverted { get; set; } 

    public BooleanAndToVisibilityConverter() 
    { 
     HiddenVisibility = Visibility.Collapsed; 
     IsInverted = false; 
    } 

    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     bool flag = values.OfType<IConvertible>().All(System.Convert.ToBoolean); 
     if (IsInverted) flag = !flag; 
     return flag ? Visibility.Visible : HiddenVisibility; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
}