WPF:转换器的基类“捕获”转换方法

时间:2013-02-11 18:34:07

标签: c# wpf inheritance converters

我想我的问题主题有点令人困惑。简而言之,我想要的是:

我的申请表中有很多Converters。其中许多人没有实现ConvertBack方法。所以我希望有一个BaseConverter类,它提供ConvertBack的简单空实现以及我从BaseConverter继承的所有其他转换器。

我对BaseConverter

的想法
public class BaseConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        // do nothing in this dummy implementation
        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        // do nothing in this dummy implementation
        return null;
    }
}

我疯狂的转换器之一:

public class CrazyConverter : BaseConverter
{
    public new object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
       return ACrazyConverionOfTheValue(...);
    }
}

但是,如果我这样尝试并使用我的CrazyConverter,我总是会使用Convert的{​​{1}}方法。我从未调用过我的新BaseClass方法。我做错了什么?

感谢您的回复!

1 个答案:

答案 0 :(得分:3)

您需要在基类virtual中创建方法,并且您的子类应该override(而不是new)。

public class BaseConverter : IValueConverter
{
    public virtual object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        // do nothing in this dummy implementation
        return null;
    }

    public virtual object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        // do nothing in this dummy implementation
        return null;
    }
}

public class CrazyConverter : BaseConverter
{
    public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
       return ACrazyConverionOfTheValue(...);
    }
}

修改:您可能还需要考虑重构这一点,要求通过使类和Convert抽象来覆盖Convert,如下所示:

public abstract class BaseConverter : IValueConverter
{
    public abstract object Convert(object value, Type targetType, object parameter, CultureInfo culture);

    public virtual object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        // do nothing in this dummy implementation
        return null;
    }
}