2013-02-11 4 views
0

Я думаю, что моя тема вопроса немного запутанна. Короче говоря, я хочу:WPF: базовый класс для преобразователей «уловы» Метод преобразования

В моем приложении много 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 метод BaseClass. Мой новый метод Convert никогда не вызывается. Что я делаю не так?

Спасибо за ответы!

+0

Так как же вы на самом деле использовать его в ваш XAML? Можете ли вы это показать? –

+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(...); 
    } 
} 

Edit: Вы могли бы также рассмотреть возможность рефакторинга это потребовать, чтобы 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; 
    } 
} 
+0

Спасибо, это отлично работает для меня. Я буду использовать подход абстрактного класса. –