2010-07-07 3 views
7

В приложении WPF/MVVM я пытаюсь найти эффективный для кода способ установить курсор основного вида на Cursors.Wait перед любой длительной операцией и восстановить его по умолчанию после завершения.Как перехватить выполнение RoutedCommand в представлении? (WPF/MVVM)

Поскольку все операции вызываются с помощью маршрутизируемых команд, я хотел бы найти способ перехвата выполнения команды, в идеале, создав общий командный класс, который обертывает экземпляр встроенной маршрутизируемой команды, но я не могу визуализируйте, как это сделать.

В частности, метод RoutedCommand.Execute не является виртуальным, поэтому мне нужен другой механизм для перехвата его вызовов. Кроме того, я не уверен, как экземпляр обобщенного командного класса ссылается на представление, для которого он должен установить курсор.

Любые советы, пожалуйста?

Спасибо,

Tim

+0

Там вполне может быть причиной того, что вы хотите сделать это, что звучит несколько сложно, но есть ли причина, по которой вы не можете просто создать свойство CurrentCursor в своей модели ViewModel и привязать курсор в своих представлениях к этому свойству? –

+1

@Wonko. Спасибо - это хороший вопрос, и я согласен, что это похоже на самый MVVM-совместимый подход. Однако это означает, что мне придется применить одно и то же изменение кода из двух строк ко многим методам ViewModel, тогда как я надеялся централизовать код управления курсором. Второе осложнение состоит в том, что в моем представлении содержатся некоторые элементы управления, которые принимают маршрутизируемые команды. Как применить ту же логику к их операциям, поскольку они не являются частью ViewModel? –

ответ

3

Вы можете установить курсор статическим способом. Эффект заключается в том, что курсор будет «Wait», в то время как приложение имеет фокус, а не когда он находится над определенным элементом управления.

код, который будет частью ViewModel в начале длительной эксплуатации:

Mouse.OverrideCursor = Cursors.Wait; 

После завершения операции вы должны очистить переопределение так:

Move.OverrideCursor = null; 
+0

спасибо за вашу идею и +1 за то, что вы научили меня чему-то новому и полезному, но она по-прежнему не решает проблем, которые я поднял в своем комментарии к @Wonko. –

+0

Альтернативой здесь является создание собственной реализации ICommand. Популярный называется RelayCommand, который, я уверен, вы можете найти где-то в сети. Если вы используете его для своих команд, вы можете абстрагировать эту обработку курсора в обработке «выполнить» базового типа. Насколько я знаю, нет возможности глобально перехватить все маршрутизированные команды. Единственный недостаток в том, что ваши команды больше не «маршрутизируются». Вместо этого они перемещаются в ViewModel. Надеюсь, что помогает. – Steven

+0

Еще раз спасибо Стивен. Это именно то, чего я пытаюсь достичь, хотя, я думаю, мне нужно подумать о том, могу ли я жить без разметки команд. Я изо всех сил пытаюсь представить себе, как это будет работать в случае встроенных команд, которые нацелены на элементы управления (например, команда ToggleBold, нацеленная на RichTextBox). Есть ли способ заставить этот сценарий работать с RelayCommand? –