3. Типичные проблемы
Сильная связность кода и UI
Тяжело разделить состояние UI и логику его
работы с логикой отображения
Тяжело протестировать состояние и работу UI
5. Separation of conserns
notifications
View data binding
commands
ViewModel Model
UI UI state and logic Business logic and data
6. Ideal for xaml
notifications
View data binding
commands
ViewModel
UI UI state and logic
DataBinding - DataContext,
DependencyProperty
Commands - ICommand, Blend interactions
7. Testability
notifications
View data binding
commands
ViewModel Model
UI UI state and logic Business logic and data
Состояние UI и логика его работы не зависит от
представления
Возможность «запустить» приложение в юнит-
тестах без UI
8. View
notifications
View data binding
commands
ViewModel Model
UI UI state and logic Business logic and data
Структура UI
DataContext = ViewModel
Минималистичность, нет code behind
Данные из Binding
Взаимодействие с ViewModel через команды
9. ViewModel
notifications
View data binding
commands
ViewModel Model
UI UI state and logic Business logic and data
Предоставляет Bindable свойства (INPC)
Предоставляет команды (ICommand)
Взаимодейтсвует с моделью
Не знает о View
Полностью тестируема
KISS, не забывая про SRP
10. Model
notifications
View data binding
commands
ViewModel Model
UI UI state and logic Business logic and data
BL, данные, клиентская объектная модель
Bindable свойства, которые могут использоваться
View напрямую или через ViewModel в качестве
адаптера
11. Команды
notifications
View data binding
commands
ViewModel Model
UI UI state and logic Business logic and data
Выполняются View при пользовательском
взаимодейтсвии (клики, ввод с клавиатуры и
т.п.)
ICommand, DelegateCommand, custom commands, etc.
12. Command pattern
Объект, представляющий собой
дейтсвие
Инкапсулирует само действие и его
параметры
15. Внедряем MVVM
Слабая связность между View и ViewModel
Слабая связность между ViewModel и Model
View рассматривайте как шаблон для представления данных
View минималистична, нет code behind
ViewModel создаётся первой и устанавливается View как
DataContext
Используется Dependency injection / IoC