我有一个BaseFormViewModel
类,其中一些ViewModel继承自该类。它继承自另一个名为BaseViewModel
的基类,它只包含INotifyPropertyChanged
接口的实现。
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评论,我意识到我通过Reflection调用每个表单(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的值,如上图所示)。
更新2:
Command
类的实现如下:
public class Command : ICommand {
public Command(Action action, bool canExecute = true) {
this.action = action;
this.canExecute = canExecute;
}
//ICommand Interface implementation here
}
更新3:
我在Form的构造函数中实例化ViewModel:
public partial class FSCStationProductionProcessMainView : UserControl {
public FSCStationProductionProcessMainView () {
InitializeComponent();
InitializeViewModel();
}
private void InitializeViewModel () {
this.DataContext = new FSCStationProductionProcessMainViewModel();
}
}
答案 0 :(得分:-1)
简单的答案是将BaseFormViewModel RaiseInitiateParameterAnswer方法实现标记为'abstract',并强制所有派生类提供实现。
但总的来说这个设计看起来过于复杂:
你真的需要这么多级别的遗产 - 从长远来看,支持和维护会很困惑和困难。
我认为继承应该在对象组织设计中谨慎使用。