Я пытаюсь вызвать одну и ту же команду из двух разных моделей представлений, но я застрял при их создании (как модели команд, так и модели представлений).
Сначала я создал ViewModel1
класс модели вида:
public class ViewModel1 : DependencyObject
{
...
// The command property
public ProcessMyString ProcessMyStringCommand { get; set; }
public ViewModel1()
{
// Command gets instantiated
this.ProcessMyStringCommand = new ProcessMyString(this);
}
internal void ProcessMyString()
{
// This is where the actual processing method is called
// somewhere from the business logic...
...
}
И класс команд ProcessMyString
:
public class ProcessMyString : ICommand
{
private ViewModel1 viewModel;
public ProcessMyString(ViewModel1 viewModel)
{
this.viewModel = viewModel;
}
public bool CanExecute(object parameter)
{
return true;
}
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public void Execute(object parameter)
{
viewModel.ProcessMyString();
}
}
Затем я создал второй класс модели представления ViewModel2
, но когда понял, что для этой модели представления также потребуется использовать ту же команду , ее конструктор
public ProcessMyString(ViewModel1 viewModel)
не будет работать, потому что он принимает параметр ViewModel1
, и мне нужно иметь возможность передавать обе модели представления. Затем я решил создать класс ViewModelBase
и сделать так, чтобы обе модели представления были расширены. Конечно, я также изменил конструктор команды:
// Constructor's parameter is now ViewModelBase
public ProcessMyString(ViewModelBase viewModel)
Но это означало, что метод команды Execute(object parameter)
теперь вызывает метод из ViewModelBase
. Это не хороший подход к приложениям, поскольку вызовы ViewModel для ProcessMyString()
должны быть зарезервированы только для классов ViewModel1
и ViewModel2
. Если бы у меня был класс ViewModel3
, я бы не хотел, чтобы он звонил ProcessMyString()
, и если бы я не расширил его с ViewModelBase
, это было бы хорошо.
Но что произойдет, если мне понадобится команда, которая разделяется между ViewModel2
и ViewModel3
?
Суммирующий вопрос: как мне организовать свои команды и модели представления, чтобы модели представления могли использовать одни и те же команды?