Подтвердить что ты не робот

WPF ICommand vs RoutedCommand

Пусть у кнопки есть свойство Command, связанное с пользовательской командой.

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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