是否可以使用多个值转换器?

时间:2016-01-14 19:13:29

标签: wpf data-binding ivalueconverter imultivalueconverter

因此,.NET有一个内置的BooleanToVisibilityConverter,当我有一个布尔值转换为可见性时,这很好。但是当我有多个条件来控制可见性时,我创建了自己的AndConverterOrConverter类。它们实现了IMultiValueConverter,因此它们可以接受多个布尔值来对它们执行andor操作,以输出单个布尔值。

问题是我需要某种方法将AndConverterOrConverter的输出“管道”到BooleanToVisibilityConverter,但我不知道这是怎么回事。我是否必须创建具有多个布尔值并输出Visibility的新转换器?我希望事实并非如此,因为我还需要将结果转换为string,以及将来可能还有其他事情。如果能够将输出从一个转换器传输到另一个转换器而不必创建新的转换器来处理每种可能的情况,那将是很好的。

1 个答案:

答案 0 :(得分:1)

我通过常规的IValueConverter做了类似的事情:

public class BooleanConverter<T> : DependencyObject, IValueConverter {

    public static DependencyProperty FalseProperty =
        DependencyProperty.Register( "False", typeof( T ), typeof( BooleanConverter<T> ), new PropertyMetadata( default( T ) ) );

    public static DependencyProperty TrueProperty =
        DependencyProperty.Register( "True", typeof( T ), typeof( BooleanConverter<T> ), new PropertyMetadata( default( T ) ) );

    public T False {
        get { return (T) GetValue( FalseProperty ); }
        set { SetValue( FalseProperty, value ); }
    }

    public T True {
        get { return (T) GetValue( TrueProperty ); }
        set { SetValue( TrueProperty, value ); }
    }

    public BooleanConverter( T trueValue, T falseValue ) {
        True  = trueValue;
        False = falseValue;
    }

    public object Convert( object value, Type targetType, object parameter, CultureInfo culture ) {
        bool b = false;
             if ( value is bool ) b = (bool) value;
        else if ( value is string ) b = bool.Parse( value as string );
        return b ? True : False;
}

    public object ConvertBack( object value, Type targetType, object parameter, CultureInfo culture ) {
        return value is T && EqualityComparer<T>.Default.Equals( (T) value, True );
    }
}

然后我实现了很多来自泛型类型的新类。例如:

[ValueConversion( typeof( bool ), typeof( Brush ) )]
public class BooleanToBrushConverter : BooleanConverter<Brush> {

    public BooleanToBrushConverter() :
        base( new SolidColorBrush( Colors.Black ), new SolidColorBrush( Colors.Red ) ) { }
}

您可以为IMultiValueConverter类做类似的事情。 True&amp; False属性仍然存在,只是决定返回哪个属性值的逻辑涉及逻辑上对传递的数组中的值进行AND运算或ORing。

这样的事情:

public class AndConverter<T> : DependencyObject,  : DependencyObject, IMultiValueConverter{

    public static DependencyProperty FalseProperty =
        DependencyProperty.Register( "False", typeof( T ), typeof( AndConverter<T> ), new PropertyMetadata( default( T ) ) );

    public static DependencyProperty TrueProperty =
        DependencyProperty.Register( "True", typeof( T ), typeof( AndConverter<T> ), new PropertyMetadata( default( T ) ) );

    public T False {
        get { return (T) GetValue( FalseProperty ); }
        set { SetValue( FalseProperty, value ); }
    }

    public T True {
        get { return (T) GetValue( TrueProperty ); }
        set { SetValue( TrueProperty, value ); }
    }

    public AndConverter( T trueValue, T falseValue ) {
        True  = trueValue;
        False = falseValue;
    }

    public object Convert( object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture ) {
        return (<Your logic to compute the result goes here>) ? True : False;
    }

    public object[] ConvertBack( object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture ) {
        // . . .
    }
}

然后,您可以创建转换为可见性的类:

[ValueConversion( typeof( bool ), typeof( Visibility ) )]
public class AndVisibilityConverter : AndConverter<Visibility> {

    public AndVisibilityConverter() :
        base( Visibility.Visible, Visibility.Hidden ) { }
}