У меня есть класс 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();
}
}
Вы бросаете свой объект на базу? – Muds
Я не могу воспроизвести это поведение из кода, который вы указали. Как реализуется ваш класс Command? – Clemens
Вызывается только метод базового класса? У вас есть что-то вроде base.RaiseInitiateParameterAnswer в вашей реализации 'FSCGeneralProductionProcessMainViewModel'? – romanoza