2013-08-14 20 views
0

Heres the trick question. У меня есть несколько команд, которые должны быть включены/отключены после вызова другой команды. Например, у меня есть команды Open, Save и Start. Команды «Сохранить и начать» должны быть включены только после успешного выполнения команды Open. И команды Open и Save должны быть отключены после вызова команды Start. Какова наилучшая практика для подобных ситуаций?Включить/отключить команды после выполнения другой команды

+0

В Prism есть класс под названием CompositeCommand, который был разработан для такого рода вещей. Но если вы не используете Prism, вы можете прочитать документы этой команды и реализовать нечто подобное. –

+0

Определите команду. Вы действительно имеете в виду метод? Что вы подразумеваете под вопросом? – Paparazzi

+0

@Blam, я догадался, что «команда» означает «команда» и «трюк», означающая «сложный». :) – Sheridan

ответ

1

В каждом экземпляре 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 переменные обратно в ложное снова на каком-то этапе, чтобы повторно включить эту функциональность.

+0

Да, я уже выяснил, для чего используется метод CanExecute, но этот метод вызывается только при запуске события CanExecuteChanged. Это то, где у меня проблемы. Мне нужно запустить это событие по нескольким командам после выполнения одной из команд. Я знаю, что это метод CommandManager.InvalidateRequerySposed, но он слишком медленный, вероятно, потому, что он повторно запрашивает все команды (и их довольно много). –