WPF - обработка событий из пользовательского элемента управления в модели просмотра
Я создаю приложение WPF с использованием шаблона MVVM (для меня это новые технологии). Я использую пользовательские элементы управления для простых бит функции многократного использования, которые не содержат бизнес-логику, и шаблон MVVM для создания логики приложения. Предположим, что представление содержит мой пользовательский элемент управления, который запускает события, и я хочу добавить обработчик события к этому событию. Этот обработчик событий должен быть в представлении модели представления, потому что он содержит бизнес-логику. Вопрос заключается в следующем: - представление и модель представления связаны только привязкой; как связать обработчик события с помощью привязки? Возможно ли это (я подозреваю, что нет)? Если нет - как я должен обрабатывать события из элемента управления в модели представления? Может быть, я должен использовать команды или INotifyPropertyChanged?
Ответы
Ответ 1
Вообще говоря, это хорошая практика MVVM, чтобы избежать кода в коде позади, как это было бы, если вы используете события в своих пользовательских элементах управления. Поэтому, когда это возможно, используйте INotifyPropertyChanged
и ICommand
.
С учетом сказанного, в зависимости от вашего проекта и того, насколько прагматичным вы являетесь, иногда имеет смысл использовать контрольный код.
В некоторых случаях я использовал что-то вроде этого:
private void textBox1_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
MyViewModel vm = this.DataContext as MyViewModel;
vm.MethodToExecute(...);
}
Вы также можете рассмотреть Attached Command Behavior, дополнительную информацию об этом и реализации, чтобы найти здесь:
Выключение события двойного щелчка из элемента списка элементов WPF с использованием MVVM
Ответ 2
Также обратите внимание на вопрос Как добавить новую команду к событию управления
Ответ 3
Использование ICommand в MVVM с помощью XAML.
http://johnpapa.net/5-simple-steps-to-commanding-in-silverlight
(MVVM должен был быть сокращен как VVMM: View, View Model, Model, также выглядит лучше:))