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



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

问题是我需要某种方式将AndConverterOrConverter的输出"管道"到BooleanToVisibilityConverter中,但我看不出这怎么可能。我是否必须创建接受多个布尔值并输出Visibility的新转换器?我希望情况并非如此,因为我还需要将结果转换为string,将来可能还有其他事情。能够将输出从一个转换器传输到另一个转换器,而不必创建新的转换器来处理每种可能的情况,那就太好了。

我用常规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 &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 ) { }
}

相关内容

  • 没有找到相关文章

最新更新