SlideShare a Scribd company logo
#msdevcon
Community Track
Объять необъятное, или как
использовать несколько MVVM
фреймворков в одном XAML проекте
Денис Цветцих
Руководитель проектов, IceRockDev
#msdevcon
Цели
Зачем нужен
MVVM
фреймворк
Как выбрать
MVVM
фреймворк
Как
использовать
несколько
MVVM
фреймворков
Чем отличаются MVVM
фреймворки
Как выбрать MVVM
фреймворк для конкретной
платформы
Какие MVVM фреймворки
мы использовали и для
каких задач
Решение какой задачи
упрощает использование
MVVM фреймворка
4
Опрос
Кто считает, что использовать несколько
MVVM нельзя?
Кто считает, что использовать несколько
MVVM можно, но не использовал?
Кто использовал несколько MVVM в одном
проекте?
5
Зачем нужен MVVM фреймворк?
Навигация
Реализация INPC (ViewModelBase)
Команды
Message Bus (EventAggregator, Messenger)
6
Зачем нужен MVVM фреймворк?
Навигация
Реализация INPC (ViewModelBase)
Команды
Message Bus (EventAggregator, Messenger)
7
Подходы к навигации
View First
ViewModel First
Это не разные реализации паттерна MVVM,
но разные подходы к навигации с
использованием MVVM
8
ViewFirst: показать новую форму
Создать View
Создать ViewModel для View
View.DataContext = ViewModel
Инициализировать ViewModel
9
ViewFirst: показать новую форму
Navigation.Show<ViewModel>(Value);
или
Navigation.Show("View", Value);
Похоже на: http://address.ru/?arg=value
ViewFirst предлагает организовать навигацию
аналогично веб-приложению
10
ViewModelFirst: показать новую форму
Создать ViewModel
Инициализировать ViewModel
Создать View для ViewModel
View.DataContext = ViewModel
11
ViewModelFirst: показать новую форму
var vm = Navigation.Get<ViewModel>();
vm.Arg = Value;
vm.Show();
Аналогично окну WPF:
var wnd = new Window();
wnd.Arg1 = Value1;
wnd.Show();
ViewModel First навигация аналогична
навигации в настольных приложениях
12
ViewFirst vs ViewModelFirst
ViewFirst ViewModelFirst
Создать View Создать ViewModel
Создать ViewModel Инициализировать ViewModel
Инициализировать ViewModel Создать View
View.DataContext = ViewModel View.DataContext = ViewModel
13
Выбор MVVM фреймворка
Выбираем MVVM фреймворк по
реализованному подходу к навигации
Навигация MVVM фреймворка соответствует
навигации в API выбранной технологии
WPF: ViewModelFirst подход (MugenMvvmToolkit, ReactiveUI)
UWP: ViewFirst подход (Prism)
14
Какие задачи решает MVVM фреймворк?
Навигация
Команды
Привязки
На уровне ViewModel: передача событий между ViewModel
На уровне View: Binding в XAML
Разные задачи можно решать при помощи
разных фреймворков!
15
Набор MVVM фреймворков для UWP
Навигация – Prism
Собственное расширение Prism для CompositeUI
Команды – ReactiveCommand из ReactiveUI
Привязки
Привязки ViewModel: Не используем MessageBus (EventAggregator из Prism)
Привязки ViewModel: ObservableForProperty, WhenAny из ReactiveUI
Привязки View: альтернативный Binding из MugenMvvmToolkit
16
Prism - ViewFirst навигация
public interface INavigationService
{
bool Navigate(string pageToken, object param);
void GoBack();
void GoForward();
void ClearHistory();
}
17
Достоинства навигации Prism
ViewFirst подход, реализованный в Prism,
соответствует API для навигации в UWP
CompositeUI не реализован в Prism для UWP, но нужное решение есть
по ссылке
https://github.com/denis-tsv/Prism.StoreApps.Extensions.Mvvm
18
ReactiveUI: команды и ViewModel привязки
public class LoginViewModel //: INotifyPropertyChanged
{
public string Login { get; set; } // PropertyChanged
public string Password { get; set; } // PropertyChanged
public ICommand LoginCommand { get; private set; }
}
19
1. ObservableForProperty
// Подписка
IDisposable _subscription =
this.ObservableForProperty(vm => vm.Login)
.Subscribe(OnLoginChanged);
// Реакция на событие
private void OnLoginChanged
(IObservedChange<LoginViewModel, String> change)
{
}
// Отписка
_subscription.Dispose();
20
1. ObservableForProperty
// Подписка
IDisposable _subscription =
this.ObservableForProperty(vm => vm.Login)
.Subscribe(OnLoginChanged);
// Реакция на событие
private void OnLoginChanged
(IObservedChange<LoginViewModel, String> change)
{
}
// Отписка
_subscription.Dispose();
21
1. ObservableForProperty
// Подписка
IDisposable _subscription =
this.ObservableForProperty(vm => vm.Login)
.Subscribe(OnLoginChanged);
// Реакция на событие
private void OnLoginChanged
(IObservedChange<LoginViewModel, String> change)
{
}
// Отписка
_subscription.Dispose();
22
1. ObservableForProperty
// Подписка
IDisposable _subscription =
this.ObservableForProperty(vm => vm.Login)
.Subscribe(OnLoginChanged);
// Реакция на событие
private void OnLoginChanged
(IObservedChange<LoginViewModel, String> change)
{
}
// Отписка
_subscription.Dispose();
23
2. WhenAny
IDisposable _subscription =
this.WhenAny(
vm => vm.Login,
vn => vm.Password,
(login, password) =>
!string.IsNullOrEmpty(login.Value) &&
!string.IsNullOrEmpty(password.Value))
.Subscribe(OnCredentialsChanged);
24
2. WhenAny
IDisposable _subscription =
this.WhenAny(
vm => vm.Login,
vn => vm.Password,
(login, password) =>
!string.IsNullOrEmpty(login.Value) &&
!string.IsNullOrEmpty(password.Value))
.Subscribe(OnCredentialsChanged);
25
2. WhenAny
IDisposable _subscription =
this.WhenAny(
vm => vm.Login,
vn => vm.Password,
(login, password) =>
!string.IsNullOrEmpty(login.Value) &&
!string.IsNullOrEmpty(password.Value))
.Subscribe(OnCredentialsChanged);
26
Достоинства ReactiveUI привязок
Удобное решение типовых задач:
Подписка на изменение одного свойства
Подписка на изменение нескольких свойств
Уменьшается количество инфраструктурного
кода, связанного с подписками и отписками
27
ReactiveCommand
CanExecute == false, когда
Логин и пароль пустые
Выполняется запрос аутентификации на сервер
28
3. ReactiveCommand
public LoginViewModel(ILoginService loginService)
{
_loginService = loginService;
var canExecute =
this.WhenAny(vm => vm.Login, vm => vm.Password,
(login, password) =>
!string.IsNullOrEmpty(login.Value) &&
!string.IsNullOrEmpty(password.Value));
29
3. ReactiveCommand
public LoginViewModel(ILoginService loginService)
{
_loginService = loginService; // Login(login, password)
var canExecute =
this.WhenAny(vm => vm.Login, vm => vm.Password,
(login, password) =>
!string.IsNullOrEmpty(login.Value) &&
!string.IsNullOrEmpty(password.Value));
30
3. ReactiveCommand
public LoginViewModel(ILoginService loginService)
{
_loginService = loginService;
var canExecute =
this.WhenAny(vm => vm.Login, vm => vm.Password,
(login, password) =>
!string.IsNullOrEmpty(login.Value) &&
!string.IsNullOrEmpty(password.Value));
31
3. ReactiveCommand
LoginCommand = ReactiveCommand.CreateAsyncTask
(canExecute,
async _ => await _loginService.Login(Login, Password));
LoginCommand.Subscribe(OnLoginCompleted);
} // of ctor
private void OnLoginCompleted(bool loginSuccessed)
{
}
32
3. ReactiveCommand
LoginCommand = ReactiveCommand.CreateAsyncTask
(canExecute,
async _ => await _loginService.Login(Login, Password));
LoginCommand.Subscribe(OnLoginCompleted);
} // of ctor
private void OnLoginCompleted(bool loginSuccessed)
{
}
33
3. ReactiveCommand
LoginCommand = ReactiveCommand.CreateAsyncTask
(canExecute,
async _ => await _loginService.Login(Login, Password));
LoginCommand.Subscribe(OnLoginCompleted);
} // of ctor
private void OnLoginCompleted(bool loginSuccessed)
{
}
34
Достоинства ReactiveCommand
Не нужно мониторить значения свойств Login и
Password
Не нужно мониторить начало и конец
асинхронной операции логина
35
Mugen: альтернативные XAML привязки
Примеры для TextBox.Text
Text Property, Mode=TwoWay, Validate=True
Text $string.Format('{0} {1}', Prop1, Prop2), Delay=100
Text Property.MyCustomMethod()
Text Prop1 ?? Prop2
Text $CustomMethod(Prop1, Prop2, ‘string value’)
Text Prop1 == ‘test’ ? Prop2 : ‘value’
36
Достоинства XAML привязок из Mugen:
Поддержка синтаксиса C#
Операторы ??, ?:, +, -, *, /, %, , ==, !=, <, >, <=, >=, &&(and), ||(or), |, &, !,
Ключевые слова
$self – текущий элемент
$root – корневой элемент
$context – текущий DataContext
$args – текущий параметр EventArgs
37
Недостаток Mugen привязок
Альтернативная реализация Binding,
которую нужно решиться использовать в
продакшене
38
Итоги: навигация
MVVM нужен для навигации
Навигация ViewFirst
Аналог навигации в веб-приложениях
Удобна для WinRT, UWP
Реализована в Prism
Навигация ViewModelFirst
Аналог навигации в настольных приложениях
Удобна для WPF, Silverlight
Реализована в MugenMvvmToolkit, ReactiveUI
39
Несколько MVVM фреймворков для UWP
Навигация – Prism
Команды – ReactiveUI
Привязки ViewModel – ReactiveUI вместо
MessageBus (EventAggregator)
Привязки XAML – Mugen привязки вместо Binding
Prism используется как MVVM фреймворк, Mugen
и ReactiveUI – как библиотеки
40
Особенности использования нескольких MVVM
Достоинство
Соединяем преимущества всех MVVM фреймворков
Недостаток
В рамках CodeReview нужно следить за тем, что каждый MVVM
используется только для своей задачи
#msdevcon
Что дальше
Посмотреть
сэмплы
ReactiveUI и
Mugen
Начните с
небольших
задач
Выпилить
MessageBus
ReactiveUI – команды
MugenMvvmToolkit –
привязки XAML
EventAggregator или
Messenger заменить на
привязки уровня ViewModel
Вам понравится ))
#msdevcon
Полезные ресурсы
MugenMvvmToolkit
https://github.com/MugenMvvmToolkit
https://habrahabr.ru/post/236745/
ReactiveUI
http://reactiveui.net/
https://github.com/reactiveui
Как реализовать CompositeUI без MessageBus
https://github.com/denis-tsv/Prism.StoreApps.Extensions.Mvvm
#msdevcon
Q&A
Объять необъятное, или как
использовать несколько MVVM
фреймворков в одном XAML проекте
Денис Цветцих
den.tsvettsih@yandex.ru
© 2016 Microsoft Corporation. All rights reserved.

More Related Content

What's hot

«Как я научился не волноваться и полюбил Android-MVP», Никита Бартишок, ABBYY
«Как я научился не волноваться и полюбил Android-MVP», Никита Бартишок, ABBYY«Как я научился не волноваться и полюбил Android-MVP», Никита Бартишок, ABBYY
«Как я научился не волноваться и полюбил Android-MVP», Никита Бартишок, ABBYY
Mail.ru Group
 
Moxy. Из чего состоит и как этим пользоваться
Moxy. Из чего состоит и как этим пользоватьсяMoxy. Из чего состоит и как этим пользоваться
Moxy. Из чего состоит и как этим пользоваться
Yuri Shmakov
 
Windows Azure and node js
Windows Azure and node jsWindows Azure and node js
Windows Azure and node js
Alex Tumanoff
 
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest
 
HTML 5: будущее уже сегодня, Сергей Байдачный, Microsoft Ukraine
HTML 5: будущее уже сегодня, Сергей Байдачный, Microsoft UkraineHTML 5: будущее уже сегодня, Сергей Байдачный, Microsoft Ukraine
HTML 5: будущее уже сегодня, Сергей Байдачный, Microsoft Ukraine
Volha Banadyseva
 
Deep Dive in Magento DI
Deep Dive in Magento DIDeep Dive in Magento DI
Deep Dive in Magento DI
Magecom UK Limited
 
Обзор SObjectizer 5.5
Обзор SObjectizer 5.5Обзор SObjectizer 5.5
Обзор SObjectizer 5.5
Yauheni Akhotnikau
 
Performance optimization: effective interaction with virtual machine
Performance optimization: effective interaction with virtual machinePerformance optimization: effective interaction with virtual machine
Performance optimization: effective interaction with virtual machine
Return on Intelligence
 
Лекция 2. Activity.
Лекция 2. Activity.Лекция 2. Activity.
Лекция 2. Activity.
Александр Брич
 
Лекция Android. Fragments, ActionBar, Drawer
Лекция Android. Fragments, ActionBar, DrawerЛекция Android. Fragments, ActionBar, Drawer
Лекция Android. Fragments, ActionBar, Drawer
Александр Брич
 
Fragments, ActionBar, Drawer
Fragments, ActionBar, DrawerFragments, ActionBar, Drawer
Fragments, ActionBar, Drawer
Александр Брич
 
«Buzzwords everywhere, или Борьба с ветряными мельницами», Артём Дроздов, Mai...
«Buzzwords everywhere, или Борьба с ветряными мельницами», Артём Дроздов, Mai...«Buzzwords everywhere, или Борьба с ветряными мельницами», Артём Дроздов, Mai...
«Buzzwords everywhere, или Борьба с ветряными мельницами», Артём Дроздов, Mai...
Mail.ru Group
 
Dependency Injection на примере Unity и NInject
Dependency Injection на примере Unity и NInjectDependency Injection на примере Unity и NInject
Dependency Injection на примере Unity и NInject
akrakovetsky
 
Модульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NETМодульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NET
Dev2Dev
 
МАИ, Сети ЭВМ, Лекция №4
МАИ, Сети ЭВМ, Лекция №4МАИ, Сети ЭВМ, Лекция №4
МАИ, Сети ЭВМ, Лекция №4
Dima Dzuba
 
Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...
Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...
Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...
CocoaHeads
 
C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.
Igor Shkulipa
 
Объектно-ориентированное программирование. Лекции 15 и 16
Объектно-ориентированное программирование. Лекции 15 и 16Объектно-ориентированное программирование. Лекции 15 и 16
Объектно-ориентированное программирование. Лекции 15 и 16
Dima Dzuba
 
C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.
Igor Shkulipa
 

What's hot (20)

«Как я научился не волноваться и полюбил Android-MVP», Никита Бартишок, ABBYY
«Как я научился не волноваться и полюбил Android-MVP», Никита Бартишок, ABBYY«Как я научился не волноваться и полюбил Android-MVP», Никита Бартишок, ABBYY
«Как я научился не волноваться и полюбил Android-MVP», Никита Бартишок, ABBYY
 
Moxy. Из чего состоит и как этим пользоваться
Moxy. Из чего состоит и как этим пользоватьсяMoxy. Из чего состоит и как этим пользоваться
Moxy. Из чего состоит и как этим пользоваться
 
Windows Azure and node js
Windows Azure and node jsWindows Azure and node js
Windows Azure and node js
 
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
 
HTML 5: будущее уже сегодня, Сергей Байдачный, Microsoft Ukraine
HTML 5: будущее уже сегодня, Сергей Байдачный, Microsoft UkraineHTML 5: будущее уже сегодня, Сергей Байдачный, Microsoft Ukraine
HTML 5: будущее уже сегодня, Сергей Байдачный, Microsoft Ukraine
 
Deep Dive in Magento DI
Deep Dive in Magento DIDeep Dive in Magento DI
Deep Dive in Magento DI
 
Обзор SObjectizer 5.5
Обзор SObjectizer 5.5Обзор SObjectizer 5.5
Обзор SObjectizer 5.5
 
Performance optimization: effective interaction with virtual machine
Performance optimization: effective interaction with virtual machinePerformance optimization: effective interaction with virtual machine
Performance optimization: effective interaction with virtual machine
 
Лекция 2. Activity.
Лекция 2. Activity.Лекция 2. Activity.
Лекция 2. Activity.
 
Лекция Android. Fragments, ActionBar, Drawer
Лекция Android. Fragments, ActionBar, DrawerЛекция Android. Fragments, ActionBar, Drawer
Лекция Android. Fragments, ActionBar, Drawer
 
Fragments, ActionBar, Drawer
Fragments, ActionBar, DrawerFragments, ActionBar, Drawer
Fragments, ActionBar, Drawer
 
«Buzzwords everywhere, или Борьба с ветряными мельницами», Артём Дроздов, Mai...
«Buzzwords everywhere, или Борьба с ветряными мельницами», Артём Дроздов, Mai...«Buzzwords everywhere, или Борьба с ветряными мельницами», Артём Дроздов, Mai...
«Buzzwords everywhere, или Борьба с ветряными мельницами», Артём Дроздов, Mai...
 
Dependency Injection на примере Unity и NInject
Dependency Injection на примере Unity и NInjectDependency Injection на примере Unity и NInject
Dependency Injection на примере Unity и NInject
 
Модульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NETМодульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NET
 
МАИ, Сети ЭВМ, Лекция №4
МАИ, Сети ЭВМ, Лекция №4МАИ, Сети ЭВМ, Лекция №4
МАИ, Сети ЭВМ, Лекция №4
 
Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...
Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...
Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...
 
Bytecode
BytecodeBytecode
Bytecode
 
C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.
 
Объектно-ориентированное программирование. Лекции 15 и 16
Объектно-ориентированное программирование. Лекции 15 и 16Объектно-ориентированное программирование. Лекции 15 и 16
Объектно-ориентированное программирование. Лекции 15 и 16
 
C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.
 

Viewers also liked

Разработка Windows 8 приложений глазами WPF/Silverlight программиста
Разработка Windows 8 приложений глазами WPF/Silverlight программистаРазработка Windows 8 приложений глазами WPF/Silverlight программиста
Разработка Windows 8 приложений глазами WPF/Silverlight программиста
Denis Tsvettsih
 
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API: SyntaxTree vs CodeDom, SemanticModel vs ReflectionRoslyn API: SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs Reflection
Denis Tsvettsih
 
Эффективные email коммуникации
Эффективные email коммуникацииЭффективные email коммуникации
Эффективные email коммуникации
Denis Tsvettsih
 
Aprendamos con nuestros sentidos
Aprendamos con nuestros sentidosAprendamos con nuestros sentidos
Aprendamos con nuestros sentidos
elylourdes
 
Galápagos
GalápagosGalápagos
Galápagos
Samary Diaz
 
Cançó d'abril
Cançó d'abrilCançó d'abril
Cançó d'abril
juuuuuud8
 
Conservación del medio ambiente
Conservación del medio ambienteConservación del medio ambiente
Conservación del medio ambiente
Neylla Raposo
 
Control inalámbrico para sistemas eléctricos 2013 2.jpg
Control inalámbrico para sistemas eléctricos 2013 2.jpgControl inalámbrico para sistemas eléctricos 2013 2.jpg
Control inalámbrico para sistemas eléctricos 2013 2.jpgAlvaro Romero Acero
 
Moda Tasarimcilari
Moda TasarimcilariModa Tasarimcilari
Moda Tasarimcilari
Cem Tolga Bayraktar
 
Presentación a identidade dixital
Presentación    a identidade dixitalPresentación    a identidade dixital
Presentación a identidade dixitalcintia.vazquez
 
The difference between the Small Business Owner Mindset and the Entrepreneuri...
The difference between the Small Business Owner Mindset and the Entrepreneuri...The difference between the Small Business Owner Mindset and the Entrepreneuri...
The difference between the Small Business Owner Mindset and the Entrepreneuri...
jane GARDNER
 
Distocias de hombro y pelviana
Distocias de hombro y pelvianaDistocias de hombro y pelviana
Distocias de hombro y pelviana
Angelo Moreno
 
La guerra civil española (copia en conflicto de felipe 2013 05-19 (1))
La guerra civil española (copia en conflicto de felipe 2013 05-19 (1))La guerra civil española (copia en conflicto de felipe 2013 05-19 (1))
La guerra civil española (copia en conflicto de felipe 2013 05-19 (1))Felipe Retamal
 
Mapa conceptual. Conservación del Ambiente
Mapa conceptual. Conservación del  Ambiente Mapa conceptual. Conservación del  Ambiente
Mapa conceptual. Conservación del Ambiente
Hellen Benedetti
 
Catéter venoso central, punción subclavia y venodisecciones
Catéter venoso central, punción subclavia y venodiseccionesCatéter venoso central, punción subclavia y venodisecciones
Catéter venoso central, punción subclavia y venodisecciones
Carlos Julio Borboa Ruiz
 
Digital B2B Inbound Content Marketing Excellence -Zaheer Nooruddin GOLIN asia
Digital B2B Inbound Content Marketing Excellence -Zaheer Nooruddin GOLIN asiaDigital B2B Inbound Content Marketing Excellence -Zaheer Nooruddin GOLIN asia
Digital B2B Inbound Content Marketing Excellence -Zaheer Nooruddin GOLIN asia
Zaheer Nooruddin
 
Capacitación Repartidores.
Capacitación Repartidores.Capacitación Repartidores.
Capacitación Repartidores.
Ernesto Valle
 

Viewers also liked (20)

Разработка Windows 8 приложений глазами WPF/Silverlight программиста
Разработка Windows 8 приложений глазами WPF/Silverlight программистаРазработка Windows 8 приложений глазами WPF/Silverlight программиста
Разработка Windows 8 приложений глазами WPF/Silverlight программиста
 
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API: SyntaxTree vs CodeDom, SemanticModel vs ReflectionRoslyn API: SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs Reflection
 
Эффективные email коммуникации
Эффективные email коммуникацииЭффективные email коммуникации
Эффективные email коммуникации
 
Aprendamos con nuestros sentidos
Aprendamos con nuestros sentidosAprendamos con nuestros sentidos
Aprendamos con nuestros sentidos
 
Galápagos
GalápagosGalápagos
Galápagos
 
Cançó d'abril
Cançó d'abrilCançó d'abril
Cançó d'abril
 
Trankrip
TrankripTrankrip
Trankrip
 
Conservación del medio ambiente
Conservación del medio ambienteConservación del medio ambiente
Conservación del medio ambiente
 
Control inalámbrico para sistemas eléctricos 2013 2.jpg
Control inalámbrico para sistemas eléctricos 2013 2.jpgControl inalámbrico para sistemas eléctricos 2013 2.jpg
Control inalámbrico para sistemas eléctricos 2013 2.jpg
 
10 rosas
10 rosas10 rosas
10 rosas
 
Moda Tasarimcilari
Moda TasarimcilariModa Tasarimcilari
Moda Tasarimcilari
 
Presentación a identidade dixital
Presentación    a identidade dixitalPresentación    a identidade dixital
Presentación a identidade dixital
 
490B report
490B report490B report
490B report
 
The difference between the Small Business Owner Mindset and the Entrepreneuri...
The difference between the Small Business Owner Mindset and the Entrepreneuri...The difference between the Small Business Owner Mindset and the Entrepreneuri...
The difference between the Small Business Owner Mindset and the Entrepreneuri...
 
Distocias de hombro y pelviana
Distocias de hombro y pelvianaDistocias de hombro y pelviana
Distocias de hombro y pelviana
 
La guerra civil española (copia en conflicto de felipe 2013 05-19 (1))
La guerra civil española (copia en conflicto de felipe 2013 05-19 (1))La guerra civil española (copia en conflicto de felipe 2013 05-19 (1))
La guerra civil española (copia en conflicto de felipe 2013 05-19 (1))
 
Mapa conceptual. Conservación del Ambiente
Mapa conceptual. Conservación del  Ambiente Mapa conceptual. Conservación del  Ambiente
Mapa conceptual. Conservación del Ambiente
 
Catéter venoso central, punción subclavia y venodisecciones
Catéter venoso central, punción subclavia y venodiseccionesCatéter venoso central, punción subclavia y venodisecciones
Catéter venoso central, punción subclavia y venodisecciones
 
Digital B2B Inbound Content Marketing Excellence -Zaheer Nooruddin GOLIN asia
Digital B2B Inbound Content Marketing Excellence -Zaheer Nooruddin GOLIN asiaDigital B2B Inbound Content Marketing Excellence -Zaheer Nooruddin GOLIN asia
Digital B2B Inbound Content Marketing Excellence -Zaheer Nooruddin GOLIN asia
 
Capacitación Repartidores.
Capacitación Repartidores.Capacitación Repartidores.
Capacitación Repartidores.
 

Similar to Объять необъятное, или как использовать несколько MVVM фреймворков в одном XAML проекте

MWWM
MWWMMWWM
MWWM
Cleveroad
 
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, ControllersШкола-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, ControllersГлеб Тарасов
 
Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Sigma Software
 
Школа-Студия разработки приложений для iOS. 5 лекция. Разное
Школа-Студия разработки приложений для iOS. 5 лекция. РазноеШкола-Студия разработки приложений для iOS. 5 лекция. Разное
Школа-Студия разработки приложений для iOS. 5 лекция. РазноеГлеб Тарасов
 
Сергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3CСергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3C
Yandex
 
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test Automation
Andrii Dzynia
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobileUA Mobile
 
AndroidMVPHelper
AndroidMVPHelperAndroidMVPHelper
AndroidMVPHelper
DataArt
 
Enterprise flex pure mvc, slides, russian
Enterprise flex pure mvc, slides, russianEnterprise flex pure mvc, slides, russian
Enterprise flex pure mvc, slides, russian
Sergiy Shychynov
 
MVVM в WinForms – DevExpress Way (теория и практика)
MVVM в WinForms – DevExpress Way (теория и практика)MVVM в WinForms – DevExpress Way (теория и практика)
MVVM в WinForms – DevExpress Way (теория и практика)
GoSharp
 
Курсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOS
Курсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOSКурсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOS
Курсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOSГлеб Тарасов
 
Mobile Fest#spb 2012
Mobile Fest#spb 2012Mobile Fest#spb 2012
Mobile Fest#spb 2012
dmalykhanov
 
Aspect Oriented Approach
Aspect Oriented ApproachAspect Oriented Approach
Aspect Oriented Approach
Dmytro Chyzhykov
 
C# Web. Занятие 11.
C# Web. Занятие 11.C# Web. Занятие 11.
C# Web. Занятие 11.
Igor Shkulipa
 
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2
Oleksii Okhrymenko
 
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Ontico
 
Enterprise flex pure mvc.v4
Enterprise flex pure mvc.v4Enterprise flex pure mvc.v4
Enterprise flex pure mvc.v4
Sergiy Shychynov
 
Luxoft async.net
Luxoft async.netLuxoft async.net
Luxoft async.net
Sergey Teplyakov
 
C# Web. Занятие 10.
C# Web. Занятие 10.C# Web. Занятие 10.
C# Web. Занятие 10.
Igor Shkulipa
 

Similar to Объять необъятное, или как использовать несколько MVVM фреймворков в одном XAML проекте (20)

MWWM
MWWMMWWM
MWWM
 
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, ControllersШкола-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
 
Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин
 
Школа-Студия разработки приложений для iOS. 5 лекция. Разное
Школа-Студия разработки приложений для iOS. 5 лекция. РазноеШкола-Студия разработки приложений для iOS. 5 лекция. Разное
Школа-Студия разработки приложений для iOS. 5 лекция. Разное
 
Сергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3CСергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3C
 
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test Automation
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobile
 
AndroidMVPHelper
AndroidMVPHelperAndroidMVPHelper
AndroidMVPHelper
 
Enterprise flex pure mvc, slides, russian
Enterprise flex pure mvc, slides, russianEnterprise flex pure mvc, slides, russian
Enterprise flex pure mvc, slides, russian
 
MVVM в WinForms – DevExpress Way (теория и практика)
MVVM в WinForms – DevExpress Way (теория и практика)MVVM в WinForms – DevExpress Way (теория и практика)
MVVM в WinForms – DevExpress Way (теория и практика)
 
Курсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOS
Курсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOSКурсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOS
Курсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOS
 
Mobile Fest#spb 2012
Mobile Fest#spb 2012Mobile Fest#spb 2012
Mobile Fest#spb 2012
 
Aspect Oriented Approach
Aspect Oriented ApproachAspect Oriented Approach
Aspect Oriented Approach
 
C# Web. Занятие 11.
C# Web. Занятие 11.C# Web. Занятие 11.
C# Web. Занятие 11.
 
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2
 
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
 
Enterprise flex pure mvc.v4
Enterprise flex pure mvc.v4Enterprise flex pure mvc.v4
Enterprise flex pure mvc.v4
 
Async
AsyncAsync
Async
 
Luxoft async.net
Luxoft async.netLuxoft async.net
Luxoft async.net
 
C# Web. Занятие 10.
C# Web. Занятие 10.C# Web. Занятие 10.
C# Web. Занятие 10.
 

Объять необъятное, или как использовать несколько MVVM фреймворков в одном XAML проекте

  • 1.
  • 2. #msdevcon Community Track Объять необъятное, или как использовать несколько MVVM фреймворков в одном XAML проекте Денис Цветцих Руководитель проектов, IceRockDev
  • 3. #msdevcon Цели Зачем нужен MVVM фреймворк Как выбрать MVVM фреймворк Как использовать несколько MVVM фреймворков Чем отличаются MVVM фреймворки Как выбрать MVVM фреймворк для конкретной платформы Какие MVVM фреймворки мы использовали и для каких задач Решение какой задачи упрощает использование MVVM фреймворка
  • 4. 4 Опрос Кто считает, что использовать несколько MVVM нельзя? Кто считает, что использовать несколько MVVM можно, но не использовал? Кто использовал несколько MVVM в одном проекте?
  • 5. 5 Зачем нужен MVVM фреймворк? Навигация Реализация INPC (ViewModelBase) Команды Message Bus (EventAggregator, Messenger)
  • 6. 6 Зачем нужен MVVM фреймворк? Навигация Реализация INPC (ViewModelBase) Команды Message Bus (EventAggregator, Messenger)
  • 7. 7 Подходы к навигации View First ViewModel First Это не разные реализации паттерна MVVM, но разные подходы к навигации с использованием MVVM
  • 8. 8 ViewFirst: показать новую форму Создать View Создать ViewModel для View View.DataContext = ViewModel Инициализировать ViewModel
  • 9. 9 ViewFirst: показать новую форму Navigation.Show<ViewModel>(Value); или Navigation.Show("View", Value); Похоже на: http://address.ru/?arg=value ViewFirst предлагает организовать навигацию аналогично веб-приложению
  • 10. 10 ViewModelFirst: показать новую форму Создать ViewModel Инициализировать ViewModel Создать View для ViewModel View.DataContext = ViewModel
  • 11. 11 ViewModelFirst: показать новую форму var vm = Navigation.Get<ViewModel>(); vm.Arg = Value; vm.Show(); Аналогично окну WPF: var wnd = new Window(); wnd.Arg1 = Value1; wnd.Show(); ViewModel First навигация аналогична навигации в настольных приложениях
  • 12. 12 ViewFirst vs ViewModelFirst ViewFirst ViewModelFirst Создать View Создать ViewModel Создать ViewModel Инициализировать ViewModel Инициализировать ViewModel Создать View View.DataContext = ViewModel View.DataContext = ViewModel
  • 13. 13 Выбор MVVM фреймворка Выбираем MVVM фреймворк по реализованному подходу к навигации Навигация MVVM фреймворка соответствует навигации в API выбранной технологии WPF: ViewModelFirst подход (MugenMvvmToolkit, ReactiveUI) UWP: ViewFirst подход (Prism)
  • 14. 14 Какие задачи решает MVVM фреймворк? Навигация Команды Привязки На уровне ViewModel: передача событий между ViewModel На уровне View: Binding в XAML Разные задачи можно решать при помощи разных фреймворков!
  • 15. 15 Набор MVVM фреймворков для UWP Навигация – Prism Собственное расширение Prism для CompositeUI Команды – ReactiveCommand из ReactiveUI Привязки Привязки ViewModel: Не используем MessageBus (EventAggregator из Prism) Привязки ViewModel: ObservableForProperty, WhenAny из ReactiveUI Привязки View: альтернативный Binding из MugenMvvmToolkit
  • 16. 16 Prism - ViewFirst навигация public interface INavigationService { bool Navigate(string pageToken, object param); void GoBack(); void GoForward(); void ClearHistory(); }
  • 17. 17 Достоинства навигации Prism ViewFirst подход, реализованный в Prism, соответствует API для навигации в UWP CompositeUI не реализован в Prism для UWP, но нужное решение есть по ссылке https://github.com/denis-tsv/Prism.StoreApps.Extensions.Mvvm
  • 18. 18 ReactiveUI: команды и ViewModel привязки public class LoginViewModel //: INotifyPropertyChanged { public string Login { get; set; } // PropertyChanged public string Password { get; set; } // PropertyChanged public ICommand LoginCommand { get; private set; } }
  • 19. 19 1. ObservableForProperty // Подписка IDisposable _subscription = this.ObservableForProperty(vm => vm.Login) .Subscribe(OnLoginChanged); // Реакция на событие private void OnLoginChanged (IObservedChange<LoginViewModel, String> change) { } // Отписка _subscription.Dispose();
  • 20. 20 1. ObservableForProperty // Подписка IDisposable _subscription = this.ObservableForProperty(vm => vm.Login) .Subscribe(OnLoginChanged); // Реакция на событие private void OnLoginChanged (IObservedChange<LoginViewModel, String> change) { } // Отписка _subscription.Dispose();
  • 21. 21 1. ObservableForProperty // Подписка IDisposable _subscription = this.ObservableForProperty(vm => vm.Login) .Subscribe(OnLoginChanged); // Реакция на событие private void OnLoginChanged (IObservedChange<LoginViewModel, String> change) { } // Отписка _subscription.Dispose();
  • 22. 22 1. ObservableForProperty // Подписка IDisposable _subscription = this.ObservableForProperty(vm => vm.Login) .Subscribe(OnLoginChanged); // Реакция на событие private void OnLoginChanged (IObservedChange<LoginViewModel, String> change) { } // Отписка _subscription.Dispose();
  • 23. 23 2. WhenAny IDisposable _subscription = this.WhenAny( vm => vm.Login, vn => vm.Password, (login, password) => !string.IsNullOrEmpty(login.Value) && !string.IsNullOrEmpty(password.Value)) .Subscribe(OnCredentialsChanged);
  • 24. 24 2. WhenAny IDisposable _subscription = this.WhenAny( vm => vm.Login, vn => vm.Password, (login, password) => !string.IsNullOrEmpty(login.Value) && !string.IsNullOrEmpty(password.Value)) .Subscribe(OnCredentialsChanged);
  • 25. 25 2. WhenAny IDisposable _subscription = this.WhenAny( vm => vm.Login, vn => vm.Password, (login, password) => !string.IsNullOrEmpty(login.Value) && !string.IsNullOrEmpty(password.Value)) .Subscribe(OnCredentialsChanged);
  • 26. 26 Достоинства ReactiveUI привязок Удобное решение типовых задач: Подписка на изменение одного свойства Подписка на изменение нескольких свойств Уменьшается количество инфраструктурного кода, связанного с подписками и отписками
  • 27. 27 ReactiveCommand CanExecute == false, когда Логин и пароль пустые Выполняется запрос аутентификации на сервер
  • 28. 28 3. ReactiveCommand public LoginViewModel(ILoginService loginService) { _loginService = loginService; var canExecute = this.WhenAny(vm => vm.Login, vm => vm.Password, (login, password) => !string.IsNullOrEmpty(login.Value) && !string.IsNullOrEmpty(password.Value));
  • 29. 29 3. ReactiveCommand public LoginViewModel(ILoginService loginService) { _loginService = loginService; // Login(login, password) var canExecute = this.WhenAny(vm => vm.Login, vm => vm.Password, (login, password) => !string.IsNullOrEmpty(login.Value) && !string.IsNullOrEmpty(password.Value));
  • 30. 30 3. ReactiveCommand public LoginViewModel(ILoginService loginService) { _loginService = loginService; var canExecute = this.WhenAny(vm => vm.Login, vm => vm.Password, (login, password) => !string.IsNullOrEmpty(login.Value) && !string.IsNullOrEmpty(password.Value));
  • 31. 31 3. ReactiveCommand LoginCommand = ReactiveCommand.CreateAsyncTask (canExecute, async _ => await _loginService.Login(Login, Password)); LoginCommand.Subscribe(OnLoginCompleted); } // of ctor private void OnLoginCompleted(bool loginSuccessed) { }
  • 32. 32 3. ReactiveCommand LoginCommand = ReactiveCommand.CreateAsyncTask (canExecute, async _ => await _loginService.Login(Login, Password)); LoginCommand.Subscribe(OnLoginCompleted); } // of ctor private void OnLoginCompleted(bool loginSuccessed) { }
  • 33. 33 3. ReactiveCommand LoginCommand = ReactiveCommand.CreateAsyncTask (canExecute, async _ => await _loginService.Login(Login, Password)); LoginCommand.Subscribe(OnLoginCompleted); } // of ctor private void OnLoginCompleted(bool loginSuccessed) { }
  • 34. 34 Достоинства ReactiveCommand Не нужно мониторить значения свойств Login и Password Не нужно мониторить начало и конец асинхронной операции логина
  • 35. 35 Mugen: альтернативные XAML привязки Примеры для TextBox.Text Text Property, Mode=TwoWay, Validate=True Text $string.Format('{0} {1}', Prop1, Prop2), Delay=100 Text Property.MyCustomMethod() Text Prop1 ?? Prop2 Text $CustomMethod(Prop1, Prop2, ‘string value’) Text Prop1 == ‘test’ ? Prop2 : ‘value’
  • 36. 36 Достоинства XAML привязок из Mugen: Поддержка синтаксиса C# Операторы ??, ?:, +, -, *, /, %, , ==, !=, <, >, <=, >=, &&(and), ||(or), |, &, !, Ключевые слова $self – текущий элемент $root – корневой элемент $context – текущий DataContext $args – текущий параметр EventArgs
  • 37. 37 Недостаток Mugen привязок Альтернативная реализация Binding, которую нужно решиться использовать в продакшене
  • 38. 38 Итоги: навигация MVVM нужен для навигации Навигация ViewFirst Аналог навигации в веб-приложениях Удобна для WinRT, UWP Реализована в Prism Навигация ViewModelFirst Аналог навигации в настольных приложениях Удобна для WPF, Silverlight Реализована в MugenMvvmToolkit, ReactiveUI
  • 39. 39 Несколько MVVM фреймворков для UWP Навигация – Prism Команды – ReactiveUI Привязки ViewModel – ReactiveUI вместо MessageBus (EventAggregator) Привязки XAML – Mugen привязки вместо Binding Prism используется как MVVM фреймворк, Mugen и ReactiveUI – как библиотеки
  • 40. 40 Особенности использования нескольких MVVM Достоинство Соединяем преимущества всех MVVM фреймворков Недостаток В рамках CodeReview нужно следить за тем, что каждый MVVM используется только для своей задачи
  • 41. #msdevcon Что дальше Посмотреть сэмплы ReactiveUI и Mugen Начните с небольших задач Выпилить MessageBus ReactiveUI – команды MugenMvvmToolkit – привязки XAML EventAggregator или Messenger заменить на привязки уровня ViewModel Вам понравится ))
  • 43. #msdevcon Q&A Объять необъятное, или как использовать несколько MVVM фреймворков в одном XAML проекте Денис Цветцих den.tsvettsih@yandex.ru
  • 44. © 2016 Microsoft Corporation. All rights reserved.

Editor's Notes

  1. Главная мысль – использовать на одном проекте несколько Mvvm можно
  2. Опрос:
  3. Бес в деталях
  4. Как в браузере
  5. Как в браузере
  6. Как в браузере
  7. Как в браузере
  8. Как в браузере
  9. Как в браузере
  10. Как в браузере
  11. Как в браузере
  12. Как в браузере
  13. Как в браузере
  14. Как в браузере
  15. Как в браузере