SlideShare ist ein Scribd-Unternehmen logo
1 von 17
Downloaden Sie, um offline zu lesen
Reactive UI
Reactive Extensions + MVVM
ReactiveUI: Rx + MVVM
Rx.NET
publicinterfaceIObservable<outT>
{
IDisposableSubscribe(IObserver<T>observer);
}
publicinterfaceIObserver<inT>
{
voidOnNext(Tvalue);
voidOnError(Exceptionerror);
voidOnCompleted();
}
ReactiveUI: Rx + MVVM
WP8
WinRT
Xamarin.Android
Xamarin.Touch
Xamarin.Mac
WPF
WinForms
Reactive Extensions + MVVM
IObservable и LINQ +
INPC, INCC
TextBox.TextChanged, ManipulationStartedEvent
етц.
изменения значения Binding
ICommand вызовы, CanExecuteChanged
Frame.Navigated, App.IsResuming етц.
тестируемый параллелизм (concurrency)
ReactiveObject
publicclassVM:ReactiveObject{
publicVM(){
this.WhenAnyValue(x=>x.Name)
.Select(x=>x.Split( '')[0])
.ToProperty( this,x=>x.FirstName);
}
publicstringFirstName{get;privateset;}
}
Декларативный стиль
свойство FirstName это подстрока Name до пробела
свойство BackgroundBrush это свойства Red, Green, Blue, объединенные в объект
Color, трансформированный в SolidColorBrush
Кнопка Login может быть нажата если свойства пароль и подтверждение пароля
непусты и совпадают
Output Properties
this.WhenAny(x=>x.Red,x=>x.Green,x=>x.Blue,
(r,g,b)=>Color.FromRgb(r.Value,g.Value,b.Value))
.Select(color=>newSolidColorBrush(color))
.ToProperty(this,x=>x.BackgroundBrush);
publicSolidColorBrushBackgroundBrush{get;privateset;}
Events
пример AutoComplete сценария
varsearchTerms=txt.Events().TextChanged
.Select(_=>txt.Text)
.Where(term=>term.Length> 3)
.Throttle(TimeSpan.FromSeconds( 1)
.DistinctUntilChanged();
varsearchResults=fromterminsearchTerms
fromwordsin_service.Search(term).TakeUntil(searchTerm
selectwords;
searchResults.ObserveOnDispatcher()
.Subscribe(words=>itemsControl.ItemsSource=words)
Commands
CanExecute via IObservable
varcommandCanExecute=newSubject<bool>();
varcommand=newReactiveCommand(commandCanExecute);
commandCanExecute.OnNext(false);
command.CanExecute(null);
>>>false
commandCanExecute.OnNext(true);
command.CanExecute(null);
>>>true
</bool>
Async action per Command execute
LoadUsersAndAvatars=newReactiveCommand();
varusersAndAvatarResults=LoadUsersAndAvatars.RegisterAsyncTask(async_=>
varusers=awaitLoadUsers();
foreach(varuinusers){
u.Avatar=awaitLoadAvatar(u.Id);
}
returnusers;
});
usersAndAvatarResults.ToProperty(this,x=>x.Users,refusers);
Bindings in code-
behind
C# более экспрессивен, нежели XAML
this.OneWayBind(ViewModel,x=>x.Name,x=>x.Name.Text);
this.Bind(ViewModel,x=>x.Name,x=>x.Name.Text);
//BindtheOKcommandtothebutton
this.BindCommand(ViewModel,x=>x.OkCommand,x=>x.OkButton);
//BindtheOKcommandtowhentheuserpressesakey
this.BindCommand(ViewModel,x=>x.OkCommand,x=>x.RootView,"KeyUp");
INCC, ReactiveList
IObservable => (selector, filter, orderer) => INCC
this.Feeds=feedModels.CreateCollection()
.CreateDerivedCollection(
CreateViewModel,
model=>model.LatestPublished>TimeBorder,
FreshFirstOrderer);
IScheduler
В Rx все асинхронные действия происходят с
помощью IScheduler
varinitialDate=DateTime.Now;
//simulatesomecolddatabeforeViewModelcreation(andsubscription)
testPodcastsSubj.OnNext(newTestPodcastItem(1,initialDate.AddDays(1)));
testPodcastsSubj.OnNext(newTestPodcastItem(2,initialDate.AddDays(2)));
varmodel=newFeedViewModel("TestFeed",testPodcasts);
Assert.AreEqual(2,((TestPodcastItem)model.LastFeedItem).Id);
Assert.AreEqual(2,model.Items.Count);
testPodcastsSubj.OnNext(newTestPodcastItem(3,initialDate.AddDays(3)));
_virtualScheduler.AdvanceBy(TimeSpan.FromSeconds(1));
Assert.AreEqual(3,((TestPodcastItem)model.LastFeedItem).Id);
Спасибо за внимание!
Сабж: ReactieUI
его автор: Паша Betts
и я, Стас Шуша
https://github.com/reactiveui
https://github.com/paulcbetts
Viber: +375298745697
ReactiveUI: Rx + MVVM

Weitere ähnliche Inhalte

Was ist angesagt?

функции в Java script
функции в Java scriptфункции в Java script
функции в Java scriptViktor Andreev
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3Eugeniy Tyumentcev
 
5.1 Перегрузка операторов
5.1 Перегрузка операторов5.1 Перегрузка операторов
5.1 Перегрузка операторовDEVTYPE
 
стандартная библиотека с++: введение
стандартная библиотека с++: введениестандартная библиотека с++: введение
стандартная библиотека с++: введениеmcroitor
 
C++ и базы данных
C++ и базы данныхC++ и базы данных
C++ и базы данныхmcroitor
 
лабораторная работа №5
лабораторная работа №5лабораторная работа №5
лабораторная работа №5Zhanna Kazakova
 
особенности программирования на с++
особенности программирования на с++особенности программирования на с++
особенности программирования на с++mcroitor
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMSergey Platonov
 
Async clinic by by Sergey Teplyakov
Async clinic by by Sergey TeplyakovAsync clinic by by Sergey Teplyakov
Async clinic by by Sergey TeplyakovAlex Tumanoff
 
Angular 2. lost in translation
Angular 2.  lost in translationAngular 2.  lost in translation
Angular 2. lost in translationallfayn
 
Cpp/cli particularities
Cpp/cli particularitiesCpp/cli particularities
Cpp/cli particularitiesmcroitor
 
async/await: собираем грабли
async/await: собираем граблиasync/await: собираем грабли
async/await: собираем граблиAndrey Chasovskikh
 
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Dima Dzuba
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey TeplyakovAlex Tumanoff
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4 Dima Dzuba
 

Was ist angesagt? (20)

функции в Java script
функции в Java scriptфункции в Java script
функции в Java script
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
 
Scala for android
Scala for androidScala for android
Scala for android
 
5.1 Перегрузка операторов
5.1 Перегрузка операторов5.1 Перегрузка операторов
5.1 Перегрузка операторов
 
стандартная библиотека с++: введение
стандартная библиотека с++: введениестандартная библиотека с++: введение
стандартная библиотека с++: введение
 
C++ и базы данных
C++ и базы данныхC++ и базы данных
C++ и базы данных
 
лекция 2
лекция 2лекция 2
лекция 2
 
лабораторная работа №5
лабораторная работа №5лабораторная работа №5
лабораторная работа №5
 
особенности программирования на с++
особенности программирования на с++особенности программирования на с++
особенности программирования на с++
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
 
Clojure #1
Clojure #1Clojure #1
Clojure #1
 
Clojure #2 (2014)
Clojure #2 (2014)Clojure #2 (2014)
Clojure #2 (2014)
 
Async clinic by by Sergey Teplyakov
Async clinic by by Sergey TeplyakovAsync clinic by by Sergey Teplyakov
Async clinic by by Sergey Teplyakov
 
Angular 2. lost in translation
Angular 2.  lost in translationAngular 2.  lost in translation
Angular 2. lost in translation
 
Cpp/cli particularities
Cpp/cli particularitiesCpp/cli particularities
Cpp/cli particularities
 
async/await: собираем грабли
async/await: собираем граблиasync/await: собираем грабли
async/await: собираем грабли
 
верификация
верификацияверификация
верификация
 
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey Teplyakov
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
 

Andere mochten auch

Andere mochten auch (6)

MVVM frameworks
MVVM frameworksMVVM frameworks
MVVM frameworks
 
Reacting with ReactiveUI
Reacting with ReactiveUIReacting with ReactiveUI
Reacting with ReactiveUI
 
Reative UI
Reative UIReative UI
Reative UI
 
AngularJS - TechTalk 3/2/2014
AngularJS - TechTalk 3/2/2014AngularJS - TechTalk 3/2/2014
AngularJS - TechTalk 3/2/2014
 
Angular 2 observables
Angular 2 observablesAngular 2 observables
Angular 2 observables
 
Angular2 rxjs
Angular2 rxjsAngular2 rxjs
Angular2 rxjs
 

Ähnlich wie ReactiveUI: Rx + MVVM

Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин Sigma Software
 
MVP, Moxy. Как правильно пользоваться
MVP, Moxy. Как правильно пользоватьсяMVP, Moxy. Как правильно пользоваться
MVP, Moxy. Как правильно пользоватьсяYuri Shmakov
 
Объять необъятное, или как использовать несколько MVVM фреймворков в одном XA...
Объять необъятное, или как использовать несколько MVVM фреймворков в одном XA...Объять необъятное, или как использовать несколько MVVM фреймворков в одном XA...
Объять необъятное, или как использовать несколько MVVM фреймворков в одном XA...Denis Tsvettsih
 
MVVM в WinForms – DevExpress Way (теория и практика)
MVVM в WinForms – DevExpress Way (теория и практика)MVVM в WinForms – DevExpress Way (теория и практика)
MVVM в WinForms – DevExpress Way (теория и практика)GoSharp
 
AndroidMVPHelper
AndroidMVPHelperAndroidMVPHelper
AndroidMVPHelperDataArt
 
Xamarin: кроссплатформенные грабли, Дмитрий Моисеев, СКБ Контур
 Xamarin: кроссплатформенные грабли, Дмитрий Моисеев, СКБ Контур  Xamarin: кроссплатформенные грабли, Дмитрий Моисеев, СКБ Контур
Xamarin: кроссплатформенные грабли, Дмитрий Моисеев, СКБ Контур it-people
 
Moxy. Как правильно пользоваться? / Юрий Шмаков (Arello Mobile)
Moxy. Как правильно пользоваться? / Юрий Шмаков (Arello Mobile)Moxy. Как правильно пользоваться? / Юрий Шмаков (Arello Mobile)
Moxy. Как правильно пользоваться? / Юрий Шмаков (Arello Mobile)Ontico
 
Как приручить реактивное программирование
Как приручить реактивное программированиеКак приручить реактивное программирование
Как приручить реактивное программированиеDenis Tsvettsih
 
Паттерны быстрой разработки WPF MVVM бизнес-приложений
Паттерны быстрой разработки WPF MVVM бизнес-приложенийПаттерны быстрой разработки WPF MVVM бизнес-приложений
Паттерны быстрой разработки WPF MVVM бизнес-приложенийGoSharp
 
#MBLTdev: Опыт использования MVVM в реальных проектах
#MBLTdev: Опыт использования MVVM в реальных проектах#MBLTdev: Опыт использования MVVM в реальных проектах
#MBLTdev: Опыт использования MVVM в реальных проектахe-Legion
 
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationAndrii Dzynia
 
Viper - чистая архитектура iOS-приложения (И. Чирков)
Viper - чистая архитектура iOS-приложения (И. Чирков)Viper - чистая архитектура iOS-приложения (И. Чирков)
Viper - чистая архитектура iOS-приложения (И. Чирков)65apps
 
Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js
Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.jsTrainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js
Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.jsDevOWL Meetup
 
Dependency injection на примере unity и n inject
Dependency injection на примере unity и n injectDependency injection на примере unity и n inject
Dependency injection на примере unity и n injectRoman Kalita
 
Dependency Injection на примере Unity и NInject
Dependency Injection на примере Unity и NInjectDependency Injection на примере Unity и NInject
Dependency Injection на примере Unity и NInjectakrakovetsky
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobileUA Mobile
 
Rambler.iOS #5: VIPER и Swift
Rambler.iOS #5: VIPER и SwiftRambler.iOS #5: VIPER и Swift
Rambler.iOS #5: VIPER и SwiftRAMBLER&Co
 

Ähnlich wie ReactiveUI: Rx + MVVM (20)

Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин
 
MVP, Moxy. Как правильно пользоваться
MVP, Moxy. Как правильно пользоватьсяMVP, Moxy. Как правильно пользоваться
MVP, Moxy. Как правильно пользоваться
 
Объять необъятное, или как использовать несколько MVVM фреймворков в одном XA...
Объять необъятное, или как использовать несколько MVVM фреймворков в одном XA...Объять необъятное, или как использовать несколько MVVM фреймворков в одном XA...
Объять необъятное, или как использовать несколько MVVM фреймворков в одном XA...
 
MVVM в WinForms – DevExpress Way (теория и практика)
MVVM в WinForms – DevExpress Way (теория и практика)MVVM в WinForms – DevExpress Way (теория и практика)
MVVM в WinForms – DevExpress Way (теория и практика)
 
AndroidMVPHelper
AndroidMVPHelperAndroidMVPHelper
AndroidMVPHelper
 
Xamarin: кроссплатформенные грабли, Дмитрий Моисеев, СКБ Контур
 Xamarin: кроссплатформенные грабли, Дмитрий Моисеев, СКБ Контур  Xamarin: кроссплатформенные грабли, Дмитрий Моисеев, СКБ Контур
Xamarin: кроссплатформенные грабли, Дмитрий Моисеев, СКБ Контур
 
Moxy. Как правильно пользоваться? / Юрий Шмаков (Arello Mobile)
Moxy. Как правильно пользоваться? / Юрий Шмаков (Arello Mobile)Moxy. Как правильно пользоваться? / Юрий Шмаков (Arello Mobile)
Moxy. Как правильно пользоваться? / Юрий Шмаков (Arello Mobile)
 
Как приручить реактивное программирование
Как приручить реактивное программированиеКак приручить реактивное программирование
Как приручить реактивное программирование
 
Паттерны быстрой разработки WPF MVVM бизнес-приложений
Паттерны быстрой разработки WPF MVVM бизнес-приложенийПаттерны быстрой разработки WPF MVVM бизнес-приложений
Паттерны быстрой разработки WPF MVVM бизнес-приложений
 
#MBLTdev: Опыт использования MVVM в реальных проектах
#MBLTdev: Опыт использования MVVM в реальных проектах#MBLTdev: Опыт использования MVVM в реальных проектах
#MBLTdev: Опыт использования MVVM в реальных проектах
 
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test Automation
 
Viper - чистая архитектура iOS-приложения (И. Чирков)
Viper - чистая архитектура iOS-приложения (И. Чирков)Viper - чистая архитектура iOS-приложения (И. Чирков)
Viper - чистая архитектура iOS-приложения (И. Чирков)
 
Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js
Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.jsTrainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js
Trainspotting Transporting: RabbitMQ, Akka.NET, Rx, MVI, Cycle.js
 
Dependency injection на примере unity и n inject
Dependency injection на примере unity и n injectDependency injection на примере unity и n inject
Dependency injection на примере unity и n inject
 
Dependency Injection на примере Unity и NInject
Dependency Injection на примере Unity и NInjectDependency Injection на примере Unity и NInject
Dependency Injection на примере Unity и NInject
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobile
 
Introduction to React
Introduction to ReactIntroduction to React
Introduction to React
 
Async
AsyncAsync
Async
 
Luxoft async.net
Luxoft async.netLuxoft async.net
Luxoft async.net
 
Rambler.iOS #5: VIPER и Swift
Rambler.iOS #5: VIPER и SwiftRambler.iOS #5: VIPER и Swift
Rambler.iOS #5: VIPER и Swift
 

ReactiveUI: Rx + MVVM