WPF ViewModel中的重写方法

时间:2015-05-01 07:46:05

标签: c# wpf mvvm overloading

我有一个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();
    }
}

1 个答案:

答案 0 :(得分:-1)

简单的答案是将BaseFormViewModel RaiseInitiateParameterAnswer方法实现标记为'abstract',并强制所有派生类提供实现。

但总的来说这个设计看起来过于复杂:

你真的需要这么多级别的遗产 - 从长远来看,支持和维护会很困惑和困难。

我认为继承应该在对象组织设计中谨慎使用。