2009-06-03 4 views
32

У меня есть файл xaml WPF, описывающий раздел графического интерфейса, и я хотел бы, чтобы включение/отключение определенного элемента управления зависело от двух других. Код выглядит примерно так на данный момент:C# WPF IsEnabled с использованием нескольких привязок?

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

Но я хотел бы, чтобы быть зависимыми от другого флажка, а так что-то вроде:

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

Что лучший способ идти о том, что ? Я не могу не чувствовать, что я пропускаю что-то очевидное или неправильно это делаю?

ответ

54

Вы можете использовать MultiBinding с преобразователем, который реализует IMultiValueConverter.

Просто чтобы дать ответ вы можете (почти) скопировать & пасты:

Статический ресурс необходим:

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

ComboBox:

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

Код для преобразователя:

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

У меня есть один вопрос, что если значения равны нулю ? Не лучше ли иметь такую ​​проверку в начале: 'if (values ​​== null) { return false; } ' ? – Devid

7

Вы также можете попробовать укороченную версию одного и те же:

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

и, конечно же, вам могут понадобиться конвертеры для видимости, тоже:

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

 Смежные вопросы

  • Нет связанных вопросов^_^