35
Укрощение MVVM с помощью Catel Маренков Вадим Викторович

Укрощение MVVM с помощью Catel · 2019-05-21 · •mvvm может очень полезный. •Использование паттерна не снимает

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Укрощение MVVM с помощью Catel · 2019-05-21 · •mvvm может очень полезный. •Использование паттерна не снимает

Укрощение MVVM с помощью Catel

Маренков Вадим Викторович

Page 2: Укрощение MVVM с помощью Catel · 2019-05-21 · •mvvm может очень полезный. •Использование паттерна не снимает

Паттерн MVVMModel View ViewModel

Общетеоретическая часть.

Page 3: Укрощение MVVM с помощью Catel · 2019-05-21 · •mvvm может очень полезный. •Использование паттерна не снимает

Представление

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

Модель

Паттерн MVVM

Уровень модели представления

Уровень модели

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

Page 4: Укрощение MVVM с помощью Catel · 2019-05-21 · •mvvm может очень полезный. •Использование паттерна не снимает

Общее представление

Варианты реализации.

Представление Представление Представление

Модель

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

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

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

Представление Представление

Модель

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

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

Модель

Page 5: Укрощение MVVM с помощью Catel · 2019-05-21 · •mvvm может очень полезный. •Использование паттерна не снимает

ToolsVM

DescriptionVM

NavigationVM

WorkflowVM

Композиция ViewModel

Page 6: Укрощение MVVM с помощью Catel · 2019-05-21 · •mvvm может очень полезный. •Использование паттерна не снимает

Паттерн MVVM. Преимущества.

• Строгая формализация взаимодействия модель – представления.

• Пригодность визуальной логике (в виде VM) для автоматического тестирования.

• Гибкость. Простота (относительная) модификации интерфейса.

• Упрощение многоплатформенной разработки.

• Теоретическая возможность параллельной разработки GUI.

Page 7: Укрощение MVVM с помощью Catel · 2019-05-21 · •mvvm может очень полезный. •Использование паттерна не снимает

Детали реализация паттерна.

Типичные сложности.

Page 8: Укрощение MVVM с помощью Catel · 2019-05-21 · •mvvm может очень полезный. •Использование паттерна не снимает

Уровень Model - ViewModel

Основные моменты.

• Связь Model с ViewModel.

• Организация сохранения изменений из VM в Model.

• Рутина.

– Дублирование свойств модели.

– Реализация INotifyPropertyChanged.

• Обертка иерархий/композиций в VM.

Page 9: Укрощение MVVM с помощью Catel · 2019-05-21 · •mvvm может очень полезный. •Использование паттерна не снимает

Создание VM.

• Агрегация модели.

var item = new ViewModel(model);

• Создание по модели.var item = Manager.CreateVM<ViewModel>(model);

// Предпочтительный вариант для неполного отображения класса модели.

Page 10: Укрощение MVVM с помощью Catel · 2019-05-21 · •mvvm может очень полезный. •Использование паттерна не снимает

Сохранение изменений в модель.

• Ручное сохранение измененний.Item.SaveChanges(); / Item.ResetChanges();

(+) Наиболее универсальное;

(-) Наиболее трудоемкое;

• Автоматическая синхронизация внутри класса VM(+) Автоматическая синхронизация изменений

(-) Ручная реализация отката изменений

• Для VM не зависящей от модели.Manager.SaveChanges(model, item);

(+) Простейшая реализация отката изменений

Page 11: Укрощение MVVM с помощью Catel · 2019-05-21 · •mvvm может очень полезный. •Использование паттерна не снимает

Иерархии.

...

Model

Model

Model Model

M1

Mn

M2

M3

VM

VM

VM VM

VM1

VMn

VM3

...

VM2

Page 12: Укрощение MVVM с помощью Catel · 2019-05-21 · •mvvm может очень полезный. •Использование паттерна не снимает

Уровень ViewModel - View

• Создание связи View – ViewModel.

• Доступ к функциональности View из ViewModel.

Page 13: Укрощение MVVM с помощью Catel · 2019-05-21 · •mvvm может очень полезный. •Использование паттерна не снимает

Создание взаимосвязи View – View Model.

• Direct.

• View first.

• ViewModel first.

Page 14: Укрощение MVVM с помощью Catel · 2019-05-21 · •mvvm может очень полезный. •Использование паттерна не снимает

Создание взаимосвязи View – View Model.

Direct

• Создать ViewModel

• Создать View

• Связать их

Варианты:– Установить DataContext.

– Тоже самое через конструктор View.

– Через Binding в xaml

View First

• View может сама создавать или получать для себя ViewModel.

• Логичнее всего делать это в конструкторе.

• Наиболее простой вариант.

• Применимо, когда ViewModel не зависит от других VM.

• Нет исходных данных для передачи во ViewModel.

Page 15: Укрощение MVVM с помощью Catel · 2019-05-21 · •mvvm может очень полезный. •Использование паттерна не снимает

Варианты реализации ViewModelFirst.

• Фреймверки.

– Декларируется VM. Фреймворк сам сопоставляет необходимую View производит связывание.

• Использование DataTemplate

Page 16: Укрощение MVVM с помощью Catel · 2019-05-21 · •mvvm может очень полезный. •Использование паттерна не снимает

Использование DataTemplate

<DataTemplate DataType="{x:TypeitemViewModel:ModelClassVM}"><viewVmRelation:ModelView />

</DataTemplate>

Page 17: Укрощение MVVM с помощью Catel · 2019-05-21 · •mvvm может очень полезный. •Использование паттерна не снимает

Доступ к View из View Model

• Неполная поддержка контролами MVVM паттерна.

• Необходимость вызовов методов View или ссылок на View в реализации методов ViewModel.

Как показать MessageBox с ошибкой из ViewModel?

Page 18: Укрощение MVVM с помощью Catel · 2019-05-21 · •mvvm может очень полезный. •Использование паттерна не снимает

Вызов методов View из VM.Варианты решения.

• Через интерфейс.

• С помощью событий.

• Через статический класс/Менеджер.

Page 19: Укрощение MVVM с помощью Catel · 2019-05-21 · •mvvm может очень полезный. •Использование паттерна не снимает

Вызов методов View из VM.Через интерфейс.

• Описать некий интерфейс IView с методами нужными для вызова во ViewModel.

• Завести свойства типа IView в VM.• Инициализировать это свойство при создании

VM, например, с помощью IoC контейнера.(+) Простота использование;(-) Захламление кода еще и интерфейсами (кроме V, VM и M)

(-) Жесткое существование привязанной к VM View.

Page 20: Укрощение MVVM с помощью Catel · 2019-05-21 · •mvvm может очень полезный. •Использование паттерна не снимает

Вызов методов View из VM.Через события.

• Создать события во ViewModel.• Подписаться во View на события VM. Либо в

конструкторе либо с помощью OnDataContextChange.

• Реализовать обработчики во View.(+) Максимальная автономность VM;(-) Много кода для вызова даже одного простого метода View.

(-) Необходимость следить за корректной отпиской от событий.

Page 21: Укрощение MVVM с помощью Catel · 2019-05-21 · •mvvm может очень полезный. •Использование паттерна не снимает

Catel Framework

Page 22: Укрощение MVVM с помощью Catel · 2019-05-21 · •mvvm может очень полезный. •Использование паттерна не снимает

Общее описаниеПоддерживаемые платформы

• WPF

• Silverlight 4

• Silverlight 5

• Windows Phone 7

• Windows Phone 8

• Windows RT

Page 23: Укрощение MVVM с помощью Catel · 2019-05-21 · •mvvm может очень полезный. •Использование паттерна не снимает

Что предоставляет Framework?

• Базовые классы для Model и ViewModel.

• Catel Property.

• Система валидации.

• Система сообщений для ViewModel’ий.

• Вспомогательные сервисы.

• IoC собственный. Поддержка сторонних.

• Классы создания UI DataWindow и UserControl.

• Behaviors для создания UI на базе стандартных компонент.

Page 24: Укрощение MVVM с помощью Catel · 2019-05-21 · •mvvm может очень полезный. •Использование паттерна не снимает

Базовые классы

• ModelBase

– INotifyPropertyChanged, IDataErrorInfo, IEditableObject

• ViewModelBase

• Command

Page 25: Укрощение MVVM с помощью Catel · 2019-05-21 · •mvvm может очень полезный. •Использование паттерна не снимает

Catel Property.

public string SimpleProperty

{

get { return GetValue<string>(SimplePropertyProperty);}

set { SetValue(SimplePropertyProperty, value); }

}

public static readonly PropertyData SimplePropertyProperty = RegisterProperty("SimpleProperty", typeof(string), "Простое свойство");

Page 26: Укрощение MVVM с помощью Catel · 2019-05-21 · •mvvm может очень полезный. •Использование паттерна не снимает

Ускорение разработки

• Шаблоны.

• Code snippet.

• Плагин Resharp’ера.

• Пробрасывание свойств через атрибуты.

Примеры

Page 27: Укрощение MVVM с помощью Catel · 2019-05-21 · •mvvm может очень полезный. •Использование паттерна не снимает

Система взаимодействия VM

[InterestedIn(typeof(FamilyViewModel))]

public class PersonViewModel : ViewModelBase

protected override void OnViewModelPropertyChanged(IViewModelviewModel, string propertyName)

{

}

protected override void OnViewModelCommandExecuted (IViewModelviewModel, ICatelCommand command, object commandParameter)

{

}

Page 28: Укрощение MVVM с помощью Catel · 2019-05-21 · •mvvm может очень полезный. •Использование паттерна не снимает

Сервисы.

• IAccelerometerService

• ICameraService

• ICompassService

• IGyroscopeService

• ILocationService

• IMessageService

• INavigationService

• IOpenFileService

• IPleaseWaitService

• IProcessService

• ISaveFileService

• IUIVisualizerService

• IVibrateService

Page 29: Укрощение MVVM с помощью Catel · 2019-05-21 · •mvvm может очень полезный. •Использование паттерна не снимает

Использование сервисовpublic class PersonViewModel : ViewModelBase

{

private readonly IUIVisualizerService uiVisualizerService;

public PersonViewModel(Person person,

IUIVisualizerService uiVisualizerService)

{

this.uiVisualizerService = uiVisualizerService;

}

public void OnShow()

{

uiVisualizerService.ShowDialog(newViewModel);

}

}

Page 30: Укрощение MVVM с помощью Catel · 2019-05-21 · •mvvm может очень полезный. •Использование паттерна не снимает

Иерархии.

...

Model

Model

Model Model

M1

Mn

M2

M3

VM

VM

VM VM

VM1

VMn

VM3

...

VM2

Page 31: Укрощение MVVM с помощью Catel · 2019-05-21 · •mvvm может очень полезный. •Использование паттерна не снимает

Проблема вложенных контролов.

• Уникальная способность Catel User Control создавать ViewModel динамически из Model.

Алгоритм работы:

• Задается тип ViewModel для контрола.

• Если у контрола нет DataContext он создает его по типу.

• Если есть, проверяет соответсвует ли он типу VM.

• Если не соответсвует пытается найти конструктор с помощью которого можно создать VM используя объект DataContext как параметр.

Page 32: Укрощение MVVM с помощью Catel · 2019-05-21 · •mvvm может очень полезный. •Использование паттерна не снимает

Иерархия с Catel

Model

VM

Model

Model

M1

Mn

M2

M3

...

VM1

VMn

VM3

VM2VM

VM

VM

Page 33: Укрощение MVVM с помощью Catel · 2019-05-21 · •mvvm может очень полезный. •Использование паттерна не снимает

Пример приложения.

• Небольшой пример приложения Catel

Page 34: Укрощение MVVM с помощью Catel · 2019-05-21 · •mvvm может очень полезный. •Использование паттерна не снимает

Заключение.

• MVVM может очень полезный.

• Использование паттерна не снимает необходимость правильногопроектирования.

• Хороший фреймворк может серьезно снизить сложность реализации паттерна.

Page 35: Укрощение MVVM с помощью Catel · 2019-05-21 · •mvvm может очень полезный. •Использование паттерна не снимает

Спасибо за внимание!