wpf, как использовать конвертер для дочерних привязок мультипривязки?

Мне нужна множественная привязка логических свойств связки, но с инвертированием некоторых из них, например:

<StackPanel>
    <StackPanel.IsEnabled>
        <MultiBinding Converter="{StaticResource BooleanAndConverter}">
            <Binding Path="IsInitialized"/>
            <Binding Path="IsFailed" Converter="{StaticResource InverseBooleanConverter}"/>
        </MultiBinding>
    </StackPanel.IsEnabled>
</StackPanel.IsEnabled>

Но я получил InvalidOperationException от InverseBooleanConverter с сообщением "Цель должна быть логической". Мой InverseBooleanConverter:

[ValueConversion(typeof(bool), typeof(bool))]
public class InverseBooleanConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter,
        System.Globalization.CultureInfo culture)
    {
        if (targetType != typeof(bool))
            throw new InvalidOperationException("The target must be a boolean");

        return !(bool)value;
    }

    public object ConvertBack(object value, Type targetType, object parameter,
        System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }
    #endregion
}

и BooleanAndConverter:

public class BooleanAndConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return values.All(value => (!(value is bool)) || (bool) value);
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException("BooleanAndConverter is a OneWay converter.");
    }
}

Итак, как использовать конвертеры с дочерними привязками?


person sdorof    schedule 22.11.2014    source источник
comment
Вы знаете, что сами создаете исключение? Не проверяйте targetType. Проверьте, является ли value логическим, затем верните обратное значение.   -  person Clemens    schedule 22.11.2014


Ответы (1)


Нет необходимости проверять targetType, просто проверьте тип value, переданный в метод Convert.

public object Convert(object value, Type targetType, 
                      object parameter, System.Globalization.CultureInfo culture)
{
    if (!(value is bool))
        throw new InvalidOperationException("Value is not bool");

    return !(bool)value;
}
person Mikko Viitala    schedule 22.11.2014