所以,.NET 有一个内置的BooleanToVisibilityConverter
,当我有一个布尔值要转换为可见性时,这很好。但是,当我有多个条件来控制可见性时,我创建了自己的AndConverter
和OrConverter
类。他们实现IMultiValueConverter,以便他们可以接受多个布尔值来对它们执行and
或or
操作以输出单个布尔值。
问题是我需要某种方式将AndConverter
或OrConverter
的输出"管道"到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 ) { }
}