2009-06-03 24 views
32

J'ai un fichier xaml WPF décrivant une section d'une interface graphique et j'aimerais que l'activation/désactivation d'un contrôle particulier dépende de deux autres. Le code ressemble à ceci au moment:C# WPF IsEnabled utilisant plusieurs liaisons?

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

Mais je voudrais que ce soit dépendante d'une autre case, si bien que quelque chose comme:

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

Quelle est la meilleure façon d'aller à ce sujet ? Je ne peux pas m'empêcher de penser qu'il me manque quelque chose d'évident ou d'y aller de la mauvaise façon?

Répondre

54

Vous pouvez utiliser un MultiBinding avec un convertisseur qui met en œuvre IMultiValueConverter.

Juste pour vous donner une réponse, vous pouvez (presque) copier & coller:

ressource statique nécessaire:

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

Le ComboBox:

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

Le code pour le convertisseur:

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

J'ai une question, si des valeurs est nulle ? N'est-il pas préférable d'avoir un chèque comme celui-ci au début: 'if (values ​​== null) { return false; } ' ? – Devid

7

Vous pouvez également essayer la version plus courte de la même:

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(); 
    } 
} 

et, bien sûr, vous devrez peut-être les convertisseurs pour une visibilité aussi:

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(); 
    } 
}