2015-05-01 2 views
0

У меня есть класс BaseFormViewModel, который наследует некоторые из ViewModels. Он наследует от другого базового класса, который называется BaseViewModel, который просто содержит реализацию интерфейса INotifyPropertyChanged.Метод переопределения в WPF ViewModel

BaseFormViewModel содержит несколько методов, которые я намереваюсь быть overriden в производных классах:

public class BaseFormViewModel : BaseViewModel { 

     public BaseFormViewModel() { 
      _InitiateParameterAnswer = new Command(param => RaiseInitiateParameterAnswer(param)); 
     } 

     protected Command _InitiateParameterAnswer; 
     public Command InitiateParameterAnswer { 
      get { 
       return _InitiateParameterAnswer; 
      } 
     } 

     protected virtual void RaiseInitiateParameterAnswer(object values) { 
      //Implementation 
     } 

     protected virtual Parameter SetAuditParameter(ParameterOption parameterOption, Guid parameterId, string remarks, string description, int weight) { 
      //Implementation 

     } 
} 

Вот один из производных классов:

public class FSCGeneralProductionProcessMainViewModel : BaseFormViewModel { 

    public FSCGeneralProductionProcessMainViewModel() { 

    } 

    protected override void RaiseInitiateParameterAnswer(object values) { 
     //Implementation 
    } 

    protected override Parameter SetAuditParameter(ParameterOption parameterOption, Guid parameterId, string remarks, string description, int weight) { 
     //Implementation 
    } 

Однако всякий раз, когда я призываю InitiateParameterAnswer команды, вызываются методы базового класса. Что мне здесь не хватает?

ОБНОВЛЕНИЕ: Благодарим за отзыв. С @Muds комментарий, я понял, что я звоню каждый вид (View) с помощью отражения и понижающее приведение его DataContext (ViewModel) для BaseFormViewModel:

//Create an instance of the corresponding form using reflection 
var instance = Activator.CreateInstance(Type.GetType(formName, true)); 

//Set the FormId 
var viewModel  = ((UserControl)instance).DataContext as BaseFormViewModel; 
viewModel.FormId = formId; 
viewModel..AuditId = auditId; 

(Причина, почему я должен это установить значение базовых свойств FormID и AuditId, как показано выше).

UPDATE 2: Command класс реализуется следующим образом:

public class Command : ICommand { 

    public Command(Action action, bool canExecute = true) { 
     this.action = action; 
     this.canExecute = canExecute; 
    } 
    //ICommand Interface implementation here 
} 

UPDATE 3:

Я экземпляр ViewModel в конструкторе формы:

public partial class FSCStationProductionProcessMainView : UserControl { 

    public FSCStationProductionProcessMainView() { 
     InitializeComponent(); 
     InitializeViewModel(); 
    } 

    private void InitializeViewModel() { 
     this.DataContext = new FSCStationProductionProcessMainViewModel(); 
    } 
} 
+0

Вы бросаете свой объект на базу? – Muds

+2

Я не могу воспроизвести это поведение из кода, который вы указали. Как реализуется ваш класс Command? – Clemens

+0

Вызывается только метод базового класса? У вас есть что-то вроде base.RaiseInitiateParameterAnswer в вашей реализации 'FSCGeneralProductionProcessMainViewModel'? – romanoza

ответ

-1

Простой ответ будет пометить реализацию BaseFormViewModel RaiseInitiateParameterAnswer как «абстрактную» и заставить все производные классы t o обеспечить реализацию.

Но в целом такой конструкции кажется слишком сложным:

вам действительно нужно так много уровней наследования ли - это будет запутанной и трудной в долгосрочной перспективе, чтобы поддержать и сохранить.

Наследование, на мой взгляд, следует использовать экономно в ориентированном на объект дизайне.

+3

Вот для чего нужны виртуальные методы, так что все классы баз данных не вынуждены иметь общую реализацию. Я не думаю, что выделение абстрактного решения – Muds

+0

доказало мою точку зрения ... – AwkwardCoder

+0

«BaseViewModel» - это базовый класс для всех ViewModels в моем приложении. «BaseFormVIewModel» предназначен для всех «форм». Он имеет четкую функциональность, которая специфична только для «Форм». Маркировка абстрактного метода приведет к дублированию кодов производного класса, который я надеялся избежать. –

Смежные вопросы