如何在wpf中使用SbyteToBoolConverter转换器,在UI中将bool属性转换为sbyte

时间:2015-07-08 09:26:33

标签: c# .net wpf xaml

我有一个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调用。

有没有办法使用相同的转换器,或者我必须创建一个与此完全相反的新转换器。

1 个答案:

答案 0 :(得分:0)

将此转换器重新用于相反的方向意味着交换ConvertConvertBack方法。从技术上讲,这应该是可行的 - 您首先需要将逻辑提取到新方法(例如,让我们调用那些ConvertBoolToSbyteConvertSbyteToBool),以及从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已经指出的那样,创建第二个转换器可能要简单得多,而且代码更容易阅读和维护。