Вы находитесь на странице: 1из 19

MVVM

План

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

Обзор MVVM

Command pattern

MVVM - подходы

Простой пример
Типичные проблемы

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

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


работы с логикой отображения

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


MVVM

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

Воможность тестировать состояние UI и


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

Потенциальная раздельная работа


разработчика и UI дизайнера
Separation of conserns

notifications

View data binding

commands
ViewModel Model

UI UI state and logic Business logic and data


Ideal for xaml
notifications

View data binding

commands
ViewModel

UI UI state and logic

DataBinding - DataContext,
DependencyProperty

Commands - ICommand, Blend interactions


Testability
notifications

View data binding

commands
ViewModel Model

UI UI state and logic Business logic and data

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


представления

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


тестах без UI
View
notifications

View data binding

commands
ViewModel Model

UI UI state and logic Business logic and data


Структура UI

DataContext = ViewModel

Минималистичность, нет code behind

Данные из Binding

Взаимодействие с ViewModel через команды


ViewModel
notifications

View data binding

commands
ViewModel Model

UI UI state and logic Business logic and data


Предоставляет Bindable свойства (INPC)

Предоставляет команды (ICommand)

Взаимодейтсвует с моделью

Не знает о View

Полностью тестируема

KISS, не забывая про SRP


Model
notifications

View data binding

commands
ViewModel Model

UI UI state and logic Business logic and data

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

Bindable свойства, которые могут использоваться


View напрямую или через ViewModel в качестве
адаптера
Команды
notifications

View data binding

commands
ViewModel Model

UI UI state and logic Business logic and data

Выполняются View при пользовательском


взаимодейтсвии (клики, ввод с клавиатуры и
т.п.)

ICommand, DelegateCommand, custom commands, etc.


Command pattern

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


дейтсвие

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


параметры
Command pattern

Undo/redo

UI макросы

Транзакции

Очереди выполнения
Command pattern in
WPF

interface ICommand
{
bool CanExecute(object);
void Execute(object);
event EventHandler
CanExecuteChanged;
}
Внедряем MVVM

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

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

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

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

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


DataContext

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


Подходы

View-first

ViewModel-first
View-first

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


(DataBinding)

perfect for modern WPF


ViewModel-first (MVP-
like)

class ViewModel
{
public ViewModel(IView view)
{
}
}
Marriage

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

Вам также может понравиться