我有一个SByteToBoolConverter,如果我们有一个sbyte类型的属性,我们可以使用复选框。代码如下:
class SbyteToBoolConverter: IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if ((sbyte)value == 0)
return false;
else
return true;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if ((bool)value)
return 1;
else
return 0;
}
}
然而,我正在寻找与此完全相反的东西,我有布尔属性,我想在UI上显示0或1,可能使用组合框控件。所以基本上我必须使用完全相反的转换器,比如BoolToSbyteConverter。
我的问题是,我们不能使用相同的SbyteToBoolConverter以某种方式实现这一点,毕竟我们只需要替换Convert和ConvertBack调用。
有没有办法使用相同的转换器,或者我必须创建一个与此完全相反的新转换器。
答案 0 :(得分:0)
将此转换器重新用于相反的方向意味着交换Convert
和ConvertBack
方法。从技术上讲,这应该是可行的 - 您首先需要将逻辑提取到新方法(例如,让我们调用那些ConvertBoolToSbyte
和ConvertSbyteToBool
),以及从Convert
/ {{ 1}}根据指定要使用的方向的标志调用其中一个。这样的转换器看起来有点类似于以下内容:
ConvertBack
从XAML中,您可以引用此转换器的两个实例,每个方向一个:
class SbyteToBoolConverter: IValueConverter
{
public bool UseOppositeDirection { get; set; }
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (UseOppositeDirection)
return ConvertSbyteToBool((sbyte)value);
else
return ConvertBoolToSbyte((bool)value);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (UseOppositeDirection)
return ConvertBoolToSbyte((bool)value);
else
return ConvertSbyteToBool((sbyte)value);
}
public sbyte ConvertBoolToSbyte(bool input)
{
if (input)
return 1;
else
return 0;
}
public bool ConvertSbyteToBool(sbyte input)
{
if (input == 0)
return false;
else
return true;
}
}
...并在<Page.Resources>
<SbyteToBoolConverter x:Key="SbyteToBoolConverter" UseOppositeDirection="False" />
<SbyteToBoolConverter x:Key="BoolToSbyteConverter" UseOppositeDirection="True" />
</Page.Resources>
表达式中使用其中一个,具体取决于所需的方向。
您也可以根据输入值的类型自动检测所需的方向,并通过此方法删除Binding
参数:
UseOppositeDirection
但是:正如Clemens已经指出的那样,创建第二个转换器可能要简单得多,而且代码更容易阅读和维护。