WPF ICommand против RoutedCommand

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

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

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

2 ответа

Решение

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

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

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

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

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

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

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

Другие вопросы по тегам