Идея заключается в том, что вы привязываете команду к кнопке, и команда управляет двумя свойствами этой кнопки: «при нажатии» и «включенным», в результате чего вы публикуете интерфейс.
Основная причина, по которой вы хотите командовать, - это возможность привязывать нажатия кнопок к действиям в вашей модели представления.
Если вы создаете одну пользовательскую команду, которая выполняет действие в качестве параметра конструктора, вы можете связать методы из вашей модели представления непосредственно с вашей командой.
public class RelayCommand: ICommandd
{
Action action;
Func<bool> canExecute;
public RelayCommand(Action action) : this(action, () => true) {}
public RelayCommand(Action action, Func<bool> canExecute)
{
this.action = action;
this.canExecute = canExecute;
}
public bool CanExecute(object parameter)
{
return canExecute();
}
public void Execute(object parameter)
{
action();
}
}
Использование в вашем представлении модели будет
public RelayCommand SaveCommand { get; set; }
SaveCommand = new RelayCommand(OnSave);
public void Save()
{
// save logic...
}
Если вы хотите подключить CanExecute, вы также можете использовать второй ctor и предоставить метод CanSave.
public RelayCommand SaveCommand { get; set; }
SaveCommand = new RelayCommand(OnSave, CanSave);
public void Save()
{
// save logic...
}
public bool CanSave()
{
return // ...
}
Как вы могли заметить, я пропустил параметр команды в моей реализации. В большинстве случаев этого будет достаточно, и вы сохраните дополнительные параметры в ваших методах-обработчиках. Для оставшихся 10% я реализовал RelayCommand<T>
, который принимает действие вместо действия и меняет метод Execute
на
public void Execute(object parameter)
{
action((T)parameter);
}
, для которого требуется параметризованный обработчик
SaveCommand = new RelayCommand<SomeType>(OnSave);
public void Save(SomeType toSave)
{
// save logic using parameter
}
Это избавит вас от всех проблем при кастинге, с которыми вы столкнетесь при использовании переменных object
, и сохранит тип ваших моделей представления в безопасности.