Heres the trick question. У меня есть несколько команд, которые должны быть включены/отключены после вызова другой команды. Например, у меня есть команды Open, Save и Start. Команды «Сохранить и начать» должны быть включены только после успешного выполнения команды Open. И команды Open и Save должны быть отключены после вызова команды Start. Какова наилучшая практика для подобных ситуаций?Включить/отключить команды после выполнения другой команды
ответ
В каждом экземпляре ICommand
есть элемент bool CanExecute
. Ответ заключается в том, чтобы поместить вашу логику в эти элементы. Я использую тип RelayCommand
, потому что я использую MVVM, но это не имеет значения для этой проблемы ... Важным является параметр bool, который указывает, может ли Command
выполнить или нет. Я хотел бы сделать что-то вроде этого:
private bool isOpen, hasStarted;
public ICommand Open
{
get { return new ActionCommand(action => OpenCommand(), canExecute =>
!hasStarted); }
}
private void OpenCommand()
{
// do your stuff here
isOpen = true;
}
public ICommand Save
{
get { return new ActionCommand(action => SaveCommand(), canExecute =>
isOpen && !hasStarted); }
}
private void SaveCommand()
{
// do your stuff here
}
public ICommand Start
{
get { return new ActionCommand(action => AudioTrack.RevertState(), canExecute =>
isOpen); }
}
private void StartCommand()
{
// do your stuff here
hasStarted = true;
}
Очевидно, что вам необходимо установить hasStarted
и isOpen
переменные обратно в ложное снова на каком-то этапе, чтобы повторно включить эту функциональность.
Да, я уже выяснил, для чего используется метод CanExecute, но этот метод вызывается только при запуске события CanExecuteChanged. Это то, где у меня проблемы. Мне нужно запустить это событие по нескольким командам после выполнения одной из команд. Я знаю, что это метод CommandManager.InvalidateRequerySposed, но он слишком медленный, вероятно, потому, что он повторно запрашивает все команды (и их довольно много). –
В Prism есть класс под названием CompositeCommand, который был разработан для такого рода вещей. Но если вы не используете Prism, вы можете прочитать документы этой команды и реализовать нечто подобное. –
Определите команду. Вы действительно имеете в виду метод? Что вы подразумеваете под вопросом? – Paparazzi
@Blam, я догадался, что «команда» означает «команда» и «трюк», означающая «сложный». :) – Sheridan