Silverlight/WPF: возврат от паттерна MVVM к MVP Гладких Денис http://outcoldman.ru История • Первое упоминание паттерна MVC в Smalltalk’80 • Задача: архитектурное решение, которое позволяло бы манипулировать графическими представлениями данных приложения таким образом, чтобы изменение Представления этих данных не влияло на бизнес-логику и данные (Модель) приложения, а так же, чтобы была возможность иметь несколько Представлений для одной Модели. Термины • Model (модель данных) - бизнес логика вашего приложения; • View (представление) – пользовательский интерфейс; • Controller (контроллер) - содержит логику на изменение модели при определенных действиях пользователя; Классический MVC Действия пользователя Передача вызова View Сообщение об изменениях Изменение модели Controller Model Реализация UserEditView Пользователь нажал Apply UserEditController Model (User,Repository) controller.UpdateUser( textBoxName.Text, … ) user.Name = name; repository.Save(user); Сообщить об изменении (INotifyPropertyChanged) Model – View – Presenter Действия пользователя 1. Passive View 2. Supervising Controller View Передача вызова Обновление Изменение модели Presenter Model Сообщение об изменениях Реализация IUserEditView UserEditView UserEditPresenter Model (User,Repository) Реализация UserEditView UserEditPresenter Model (User,Repository) Пользователь нажал Apply presenter.UpdateUser( ); name = view.UserName; user.Name = name; repository.Save(user); view.UserName = user.Name; Silverlight/WPF Binding INotifyPropertyChanged INotifyCollectionChanged DependencyObject View МАГИЯ TextBox UserName Button Command Controller Model – View – Presenter Действия пользователя View Передача вызова Обновление Изменение модели Presenter Model Сообщение об изменениях Model – View – ViewModel Действия пользователя View Передача вызова Обновление Изменение модели ViewModel Model Сообщение об изменениях Реализация Магия UserEditView UserEditViewModel Model (User,Repository) Пользователь нажал Apply ExecuteSaveCommand() name = UserName; user.Name = name; repository.Save(user); TextBox получит актуальное значение Задачи (View / ViewModel) Установка значений в соответствующие контролы View Визуализация контролов Связь/взаимодей ствие с моделью Валидация измененных / новых данных ViewModel Создание данных (из Модели) для отображения BindingModel Создание данных BindingModel . (из Модели) . . для отображения View Валидация измененных / новых данных Presenter ViewModel Связь/взаимодей . . ствие с моделью Demo (by Davy Brion) Silverlight/WPF: возврат от паттерна MVVM к MVP Гладких Денис (outcoldman) • http://outcoldman.ru • http://twitter.com/outcoldman • [email protected]