Download - MVVM in WPF
MVVM
План
Проблемы, которые решает MVVM
Обзор MVVM
Command pattern
MVVM - подходы
Простой пример
Типичные проблемы
Сильная связность кода и UI
Тяжело разделить состояние UI и логику его работы с логикой отображения
Тяжело протестировать состояние и работу UI
MVVM
Разделение интересов и ответственности
Воможность тестировать состояние UI и логику его работы, не заботясь о представлении
Потенциальная раздельная работа разработчика и UI дизайнера
Separation of conserns
View ViewModel Modelnotifications
data binding
commands
UI state and logicUI Business logic and data
Ideal for xaml
DataBinding - DataContext, DependencyProperty
Commands - ICommand, Blend interactions
View ViewModelnotifications
data binding
commands
UI state and logicUI
Testability
Состояние UI и логика его работы не зависит от представления
Возможность «запустить» приложение в юнит-тестах без UI
View ViewModel Modelnotifications
data binding
commands
UI state and logicUI Business logic and data
View
Структура UI
DataContext = ViewModel
Минималистичность, нет code behind
Данные из Binding
Взаимодействие с ViewModel через команды
View ViewModel Modelnotifications
data binding
commands
UI state and logicUI Business logic and data
ViewModel
Предоставляет Bindable свойства (INPC)
Предоставляет команды (ICommand)
Взаимодейтсвует с моделью
Не знает о View
Полностью тестируема
KISS, не забывая про SRP
View ViewModel Modelnotifications
data binding
commands
UI state and logicUI Business logic and data
Model
BL, данные, клиентская объектная модель
Bindable свойства, которые могут использоваться View напрямую или через ViewModel в качестве адаптера
View ViewModel Modelnotifications
data binding
commands
UI state and logicUI Business logic and data
Команды
Выполняются View при пользовательском взаимодейтсвии (клики, ввод с клавиатуры и т.п.)
ICommand, DelegateCommand, custom commands, etc.
View ViewModel Modelnotifications
data binding
commands
UI state and logicUI Business logic and data
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);