19
MVVM

MVVM in WPF

Embed Size (px)

Citation preview

Page 1: MVVM in WPF

MVVM

Page 2: MVVM in WPF

План

Проблемы, которые решает MVVM

Обзор MVVM

Command pattern

MVVM - подходы

Простой пример

Page 3: MVVM in WPF

Типичные проблемы

Сильная связность кода и UI

Тяжело разделить состояние UI и логику его работы с логикой отображения

Тяжело протестировать состояние и работу UI

Page 4: MVVM in WPF

MVVM

Разделение интересов и ответственности

Воможность тестировать состояние UI и логику его работы, не заботясь о представлении

Потенциальная раздельная работа разработчика и UI дизайнера

Page 5: MVVM in WPF

Separation of conserns

View ViewModel Modelnotifications

data binding

commands

UI state and logicUI Business logic and data

Page 6: MVVM in WPF

Ideal for xaml

DataBinding - DataContext, DependencyProperty

Commands - ICommand, Blend interactions

View ViewModelnotifications

data binding

commands

UI state and logicUI

Page 7: MVVM in WPF

Testability

Состояние UI и логика его работы не зависит от представления

Возможность «запустить» приложение в юнит-тестах без UI

View ViewModel Modelnotifications

data binding

commands

UI state and logicUI Business logic and data

Page 8: MVVM in WPF

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

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

Model

BL, данные, клиентская объектная модель

Bindable свойства, которые могут использоваться View напрямую или через ViewModel в качестве адаптера

View ViewModel Modelnotifications

data binding

commands

UI state and logicUI Business logic and data

Page 11: MVVM in WPF

Команды

Выполняются 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

Command pattern

Объект, представляющий собой дейтсвие

Инкапсулирует само действие и его параметры

Page 13: MVVM in WPF

Command pattern

Undo/redo

UI макросы

Транзакции

Очереди выполнения

Page 14: MVVM in WPF

Command pattern in WPF

interface ICommand{

bool CanExecute(object);void Execute(object);event EventHandler CanExecuteChanged;

}

Page 15: MVVM in WPF

Внедряем MVVM

Слабая связность между View и ViewModel

Слабая связность между ViewModel и Model

View рассматривайте как шаблон для представления данных

View минималистична, нет code behind

ViewModel создаётся первой и устанавливается View как DataContext

Используется Dependency injection / IoC

Page 16: MVVM in WPF

Подходы

View-first

ViewModel-first

Page 17: MVVM in WPF

View-first

xamly. View ссылается на ViewModel (DataBinding)

perfect for modern WPF

Page 18: MVVM in WPF

ViewModel-first (MVP-like)

class ViewModel{

public ViewModel(IView view){}

}

Page 19: MVVM in WPF

Marriage

interface IView{

void ApplyViewModel(object viewModel);}IView view = container.Resolve<IGameView>();IViewModel container.Resolve<IGameViewModel>();view.ApplyViewModel(vm);