Почему бы не создать подкласс типа RelayCommandWithCannotExecuteReason
и создать выделенный объект команды?Вся логика содержится в команде, все, что вы будете делать, это создавать несколько команд во всех ваших моделях представлений.
Нет ничего плохого в создании выделенного класса команд для обработки логики, специфичной для ВМ, вот чтопрограммисты делают.Создание конкретной реализации абстракции, такой как ICommand
или RelayCommandWithCannotExecuteReason
, является ТВЕРДЫМ.
public class CopyCommand : RelayCommandWithCannotExecuteReason
{
ViewModel _vm;
public CopyCommand( ViewModel vm)
{
_vm = vm;
}
public void Execute(object parameter)
{
switch (_vm.SelectedTabIndex)
{
case 1:
_vm.Clipboard.SetData("First", object1);
break;
case 2:
_vm.Clipboard.SetData("Second", object2;
break;
}
}
public bool CanExecute(object parameter)
{
return true;
}
}
Теперь вы используете эту команду в своей виртуальной машине.Есть много простых способов, вот пример, похожий на тот, который у вас есть сейчас ...
public CopyCommand Copy
{
get
{
if (_copy == null)
{
_copy = new CopyCommand(this);
}
return _copy;
}
Или создайте экземпляр в конструкторе или инициализаторе вашей основной виртуальной машины:
public ViewModel() //constructor
{
_copy = new CopyCommand(this);
}
public CopyCommand Copy
{
get
{
return _copy;
}
}
Если у вас есть экземпляр модели представления для каждой вкладки и вы хотите делегировать логику CanExecute () для «SelectedTab», тогда вам понадобится что-то вроде этого:
Давайте предположим, что все ваши модели представления наследуютбазовый класс, подобный этому:
public abstract class BaseTabViewModel
{
public abstract bool CanCopy();
}
Тогда вы бы подкласса этого базового класса в ваших моделях представления вкладок.Вы бы реализовали абстракцию:
public class Tab1ViewModel : BaseTabViewModel
{
…
public override bool CanCopy(){
//custom logic....
return true;
}
Теперь нам нужно изменить порядок CopyCommand для ссылки на абстракцию, я изначально закодировал эту команду для использования ViewModel
, теперь мы вместо этого определим тип как абстракцию.Поэтому измените класс ViewModel:
public class CopyCommand : RelayCommandWithCannotExecuteReason
{
BaseTabViewModel _vm;
public CopyCommand( BaseTabViewModel vm)
{
_vm = vm;
}
Теперь метод CanExecute () может вызывать соответствующую логику:
public bool CanExecute(object parameter)
{
return _vm.CanCopy();
}
Это работает, только если:
- Все модели представлений вкладок являются экземплярами типа
BaseTabViewModel
.
Этот механизм намного более понятен и более гибок.Удачи.