mvvm in wpf
TRANSCRIPT
![Page 1: MVVM in WPF](https://reader033.vdocuments.net/reader033/viewer/2022052218/558a4796d8b42aa2368b462c/html5/thumbnails/1.jpg)
MVVM
![Page 2: MVVM in WPF](https://reader033.vdocuments.net/reader033/viewer/2022052218/558a4796d8b42aa2368b462c/html5/thumbnails/2.jpg)
План
Проблемы, которые решает MVVM
Обзор MVVM
Command pattern
MVVM - подходы
Простой пример
![Page 3: MVVM in WPF](https://reader033.vdocuments.net/reader033/viewer/2022052218/558a4796d8b42aa2368b462c/html5/thumbnails/3.jpg)
Типичные проблемы
Сильная связность кода и UI
Тяжело разделить состояние UI и логику его работы с логикой отображения
Тяжело протестировать состояние и работу UI
![Page 4: MVVM in WPF](https://reader033.vdocuments.net/reader033/viewer/2022052218/558a4796d8b42aa2368b462c/html5/thumbnails/4.jpg)
MVVM
Разделение интересов и ответственности
Воможность тестировать состояние UI и логику его работы, не заботясь о представлении
Потенциальная раздельная работа разработчика и UI дизайнера
![Page 5: MVVM in WPF](https://reader033.vdocuments.net/reader033/viewer/2022052218/558a4796d8b42aa2368b462c/html5/thumbnails/5.jpg)
Separation of conserns
View ViewModel Modelnotifications
data binding
commands
UI state and logicUI Business logic and data
![Page 6: MVVM in WPF](https://reader033.vdocuments.net/reader033/viewer/2022052218/558a4796d8b42aa2368b462c/html5/thumbnails/6.jpg)
Ideal for xaml
DataBinding - DataContext, DependencyProperty
Commands - ICommand, Blend interactions
View ViewModelnotifications
data binding
commands
UI state and logicUI
![Page 7: MVVM in WPF](https://reader033.vdocuments.net/reader033/viewer/2022052218/558a4796d8b42aa2368b462c/html5/thumbnails/7.jpg)
Testability
Состояние UI и логика его работы не зависит от представления
Возможность «запустить» приложение в юнит-тестах без UI
View ViewModel Modelnotifications
data binding
commands
UI state and logicUI Business logic and data
![Page 8: MVVM in WPF](https://reader033.vdocuments.net/reader033/viewer/2022052218/558a4796d8b42aa2368b462c/html5/thumbnails/8.jpg)
View
Структура UI
DataContext = ViewModel
Минималистичность, нет code behind
Данные из Binding
Взаимодействие с ViewModel через команды
View ViewModel Modelnotifications
data binding
commands
UI state and logicUI Business logic and data
![Page 9: MVVM in WPF](https://reader033.vdocuments.net/reader033/viewer/2022052218/558a4796d8b42aa2368b462c/html5/thumbnails/9.jpg)
ViewModel
Предоставляет Bindable свойства (INPC)
Предоставляет команды (ICommand)
Взаимодейтсвует с моделью
Не знает о View
Полностью тестируема
KISS, не забывая про SRP
View ViewModel Modelnotifications
data binding
commands
UI state and logicUI Business logic and data
![Page 10: MVVM in WPF](https://reader033.vdocuments.net/reader033/viewer/2022052218/558a4796d8b42aa2368b462c/html5/thumbnails/10.jpg)
Model
BL, данные, клиентская объектная модель
Bindable свойства, которые могут использоваться View напрямую или через ViewModel в качестве адаптера
View ViewModel Modelnotifications
data binding
commands
UI state and logicUI Business logic and data
![Page 11: MVVM in WPF](https://reader033.vdocuments.net/reader033/viewer/2022052218/558a4796d8b42aa2368b462c/html5/thumbnails/11.jpg)
Команды
Выполняются View при пользовательском взаимодейтсвии (клики, ввод с клавиатуры и т.п.)
ICommand, DelegateCommand, custom commands, etc.
View ViewModel Modelnotifications
data binding
commands
UI state and logicUI Business logic and data
![Page 12: MVVM in WPF](https://reader033.vdocuments.net/reader033/viewer/2022052218/558a4796d8b42aa2368b462c/html5/thumbnails/12.jpg)
Command pattern
Объект, представляющий собой дейтсвие
Инкапсулирует само действие и его параметры
![Page 13: MVVM in WPF](https://reader033.vdocuments.net/reader033/viewer/2022052218/558a4796d8b42aa2368b462c/html5/thumbnails/13.jpg)
Command pattern
Undo/redo
UI макросы
Транзакции
Очереди выполнения
![Page 14: MVVM in WPF](https://reader033.vdocuments.net/reader033/viewer/2022052218/558a4796d8b42aa2368b462c/html5/thumbnails/14.jpg)
Command pattern in WPF
interface ICommand{
bool CanExecute(object);void Execute(object);event EventHandler CanExecuteChanged;
}
![Page 15: MVVM in WPF](https://reader033.vdocuments.net/reader033/viewer/2022052218/558a4796d8b42aa2368b462c/html5/thumbnails/15.jpg)
Внедряем MVVM
Слабая связность между View и ViewModel
Слабая связность между ViewModel и Model
View рассматривайте как шаблон для представления данных
View минималистична, нет code behind
ViewModel создаётся первой и устанавливается View как DataContext
Используется Dependency injection / IoC
![Page 16: MVVM in WPF](https://reader033.vdocuments.net/reader033/viewer/2022052218/558a4796d8b42aa2368b462c/html5/thumbnails/16.jpg)
Подходы
View-first
ViewModel-first
![Page 17: MVVM in WPF](https://reader033.vdocuments.net/reader033/viewer/2022052218/558a4796d8b42aa2368b462c/html5/thumbnails/17.jpg)
View-first
xamly. View ссылается на ViewModel (DataBinding)
perfect for modern WPF
![Page 18: MVVM in WPF](https://reader033.vdocuments.net/reader033/viewer/2022052218/558a4796d8b42aa2368b462c/html5/thumbnails/18.jpg)
ViewModel-first (MVP-like)
class ViewModel{
public ViewModel(IView view){}
}
![Page 19: MVVM in WPF](https://reader033.vdocuments.net/reader033/viewer/2022052218/558a4796d8b42aa2368b462c/html5/thumbnails/19.jpg)
Marriage
interface IView{
void ApplyViewModel(object viewModel);}IView view = container.Resolve<IGameView>();IViewModel container.Resolve<IGameViewModel>();view.ApplyViewModel(vm);