В MVVM, как лучше всего, чтобы ViewModel отвечал на действия пользователя в представлении?
Я понимаю, что в MVVM:
- Вид знает о ViewModel
- ViewModel знает о модели
- но он не работает вверх, поэтому Model ничего не знает о ViewModel
- и ViewModel ничего не знает о представлении
Итак, , как ViewModel отвечает на действия, которые пользователь делает в представлении, например. введите что-то в TextBox или переместите ползунок и т.д.
-
Я понимаю, что это делается с помощью RoutedEvents, но почти все примеры RoutedEvent, которые я нахожу, используют CodeBehind в представлении, и это именно то, чего у вас больше нет в MVVM.
-
Итак, это оставляет RoutedCommands, который я нахожу больше примеров в MVVM, но, например, перемещение ползунка действительно не является командой в этом смысле, это событие, поэтому мне интересно, действительно ли это то, что следует использовать.
-
Затем я прочитал совет, например:" В MVVM используйте RoutedEvents как можно меньше и нет RoutedCommands. OK.
-
Таким образом, что листья, например. в WPF Model-View-ViewModel Toolkit 0.1 создайте команду WPF самостоятельно, у вас есть " DelegateCommand", который также выглядит интересным способом.
-
Затем некоторые люди также используют " RelayCommand".
Это много вариантов и путаницы для того, чтобы делать что-то такое для разработки приложений.
Как лучше всего сделать в MVVM то, что мы делали в течение последних 10 лет с помощью кода Behind:
- кнопка создания
- кнопка двойного щелчка
- написать код обработки
Ответы
Ответ 1
Просто, чтобы быть ясным, когда люди упоминают DelegateCommand и RelayCommand, они действительно говорят об одном и том же: реализация ICommand, которая позволяет вам передать делегат, Вы можете использовать их взаимозаменяемо.
Насколько мне известно, привязка вашего представления (XAML) к DelegateCommands в ViewModel - лучший способ реализовать MVVM.
Я стараюсь держаться подальше от RoutedEvents и кода по возможности.
Ответ 2
Для кнопок и других триггеров я использую интерфейс ICommand, предоставляемый WPF, аналогично тому, с которым вы связались. (на самом деле я использую команду Relay как определенную здесь)
Когда вы меняете значение (перемещение ползунка, ввод текста в текстовое поле), используйте привязки и поведение обработчика, когда установлено свойство в ViewModel.
Как правило, я обнаружил, что в приложении MVVM очень мало оснований использовать RoutedEvents, но они являются приятным знакомым комфортным одеялом, когда вы не можете достичь того, что хотите, с помощью новых специальных методов WPF.