0

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

问题是我需要某种方式将输出从我的AndConverterOrConverter到的“管道”,BooleanToVisibilityConverter但我不明白这是怎么可能的。我是否必须创建采用多个布尔值并输出 a 的新转换器Visibility?我希望不是这样,因为我还需要将结果转换为 a string,将来可能还有其他东西。如果能够将一个转换器的输出通过管道传输到另一个转换器,而不必创建新的转换器来处理所有可能的情况,那就太好了。

4

1 回答 1

2

我做了一些你正在寻找的常规操作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只是决定返回哪个属性值的逻辑涉及对传递的数组中的值进行逻辑与或或运算。

像这样的东西:

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 ) { }
}
于 2016-01-14T19:27:56.450 回答