2009-07-16 6 views
45

Давайте будем иметь свойство Command, связанное с пользовательской командой.WPF ICommand vs RoutedCommand

Когда следует использовать ICommand и когда они получены от RoutedCommand? Я вижу, что RoutedCommand реализует ICommand.

В каком случае мне может понадобиться убрать ICommand? Что относительно модели MVVM? Какой из них лучше подходит для этой цели?

ответ

63

Как вы уже заметили, что RoutedCommand class является реализация интерфейса ICommand, его главное отличие, если что его функция подобна тому из RoutedEvent:

Выполнить и методы CanExecute на RoutedCommand не содержат логика приложения для команды, как в случае с типичной ICommand, но, скорее, эти методы поднимают события, которые пересекают дерево элементов, ищущих объект с CommandBinding. Обработчики событий, связанные с CommandBinding, содержат логику команд.

Метод Execute вызывает события PreviewExecuted и Executed. Метод CanExecute вызывает события PreviewCanExecute и CanExecute.

В случае, если вы не хотите о поведении RoutedCommand вы будете смотреть на свою собственную реализацию ICommand. Что касается шаблона MVVM, я не могу сказать, что одно решение, похоже, у каждого своя методология. Тем не менее, вот несколько подходов к решению этой проблемы, которые я сталкивался:

+0

Хороший ответ. +1 – micahtan

+0

Спасибо. Я думаю, самое главное подумать, что они пересекают дерево, ищущее объект с CommandBinding. Как и в MVVM, я хочу избежать CommandBindings, я решаю для ICommand. –

22

только что я добавлю к ответу Rich McGuire, заключается в том, что RoutedCommands (и их более распространенный потомок RoutedUICommand должны быть подключены с обработчиками событий для правильной работы.

Большинство реализаций MVVM Я столкнулся с попыткой использовать привязку к ViewModel, и поэтому ViewModel (а не View) владеет логикой CanExecute/Execute.

Напротив, обработчики событий переносят эту нагрузку на представление. Обработка затем может быть передана в ViewModel, но это означает несколько более высокую степень связи между ViewModel и View (литье + вызов метода и т. Д.).

Смежные вопросы