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, я не могу сказать, что одно решение, похоже, у каждого своя методология. Однако вот несколько подходов к этой проблеме, с которыми я столкнулся:
- Использование RoutedCommands с ViewModel в WPF
- Релейная командная логика
- Простая команда (почти такая же, как и для релейной, но ее стоит прочитать)
Единственное, что я хотел бы добавить к ответу Rich McGuire, - это то, что RoutedCommands (и их более распространенный потомок RoutedUICommand должны быть связаны с обработчиками событий для корректной работы).
В большинстве реализаций MVVM я сталкивался с попыткой использовать привязку к ViewModel, и, таким образом, ViewModel (а не View) владеет логикой CanExecute/Execute.
Напротив, обработчики событий переносят это бремя на View. Затем обработку можно распространить на ViewModel, но это означает немного более высокую степень связи между ViewModel и View (приведение + вызов метода и т. Д.).