none
Как в приложении MVVM временно отключить CommandManager в модели представления? ICommand я реализую сам. RoutedCommand не использую. RRS feed

  • Вопрос

  • Добрый день.

    Можно ли использовать в приложении, построенном по шаблону MVVM, методы класса CommandManager: RemoveCanExecuteHandler или RemovePreviewCanExecuteHandler. Мне надо на время отключить CommandManager в приложении, а потом опять включить. Команды в приложении я определяю сам (сам реализую ICommand). Для отключения, кроме этих методов я ничего другого не нашёл. Если, например, я отключу CommandManager от команды для кнопки методам RemoveCanExecuteHandler или RemovePreviewCanExecuteHandler, то я потом в нужный момент работы программы смогу опять включить его? Дело в том, что когда я открываю Combobox в представлении (view), то в модели представления (view model) CommandManager начинает многократно генеоировать событие RequerySuggested и запускать ICommand.CanExecute для одних и тех же команд. Это влечёт за собой многократные контекстные переключения из потока UI (представления) в поток ViewModel (модели представления) и обратно. В этом я убедился, проверив работу программы по точкам останова в отладчике. И ещё второй вопрос: чем различаются между собой RemoveCanExecuteHandler и RemovePreviewCanExecuteHandler?

    • Изменено TownSparrow 20 июля 2013 г. 12:06 исправлено
    20 июля 2013 г. 12:04

Ответы


  • Можно ли использовать в приложении, построенном по шаблону MVVM, методы класса CommandManager: RemoveCanExecuteHandler или RemovePreviewCanExecuteHandler. 

    Ничего не мешает.

    Если, например, я отключу CommandManager от команды для кнопки методам RemoveCanExecuteHandler или RemovePreviewCanExecuteHandler, то я потом в нужный момент работы программы смогу опять включить его?

    Да. Для этого существуют методы AddPreviewCanExecuteHandler и AddPreviewExecutedHandler и и.д.

    Дело в том, что когда я открываю Combobox в представлении (view), то в модели представления (view model) CommandManager начинает многократно генеоировать событие RequerySuggested и запускать ICommand.CanExecute для одних и тех же команд. Это влечёт за собой многократные контекстные переключения из потока UI (представления) в поток ViewModel (модели представления) и обратно.

    Что еще за "контекстные переключения"?! Код CanExecute выполняется в UI-потоке. По всей видимости каждый элемент вашего списка содержит кнопку, привязанную к команде, поэтому для каждой команды вызывается CanExecute, дабы проверить доступность этой команды.

    И ещё второй вопрос: чем различаются между собой RemoveCanExecuteHandler и RemovePreviewCanExecuteHandler?

    Читайте События ввода WPF

    • Помечено в качестве ответа TownSparrow 22 июля 2013 г. 10:47
    21 июля 2013 г. 14:02