SlideShare a Scribd company logo
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

More Related Content

PDF
RxJava+RxAndroid (Lecture 20 – rx java)
PDF
PPTX
Reactive extensions
PDF
Функциональное программирование и Clojure
PDF
Антон Полухин, Немного о Boost
PDF
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
PDF
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
PPT
Mike ponomarenko java17-fork-v1.2
RxJava+RxAndroid (Lecture 20 – rx java)
Reactive extensions
Функциональное программирование и Clojure
Антон Полухин, Немного о Boost
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
Mike ponomarenko java17-fork-v1.2

What's hot (20)

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

Viewers also liked (6)

PPT
MVVM frameworks
PPTX
Reacting with ReactiveUI
PDF
Reative UI
PDF
AngularJS - TechTalk 3/2/2014
PDF
Angular 2 observables
PPTX
Angular2 rxjs
MVVM frameworks
Reacting with ReactiveUI
Reative UI
AngularJS - TechTalk 3/2/2014
Angular 2 observables
Angular2 rxjs
Ad

Similar to ReactiveUI: Rx + MVVM (9)

PPTX
Reactive UI на C#
PPTX
Как приручить реактивное программирование
PPTX
Объять необъятное, или как использовать несколько MVVM фреймворков в одном XA...
PDF
Как приручить реактивное программирование
PPTX
Как приручить реактивное программирование в XAML приложениях
PDF
Живые приложения с Rx
PPTX
Reactive Extensions
PPTX
Разработка WPF приложений в стиле ViewModel First
PDF
MVVM в WinForms – DevExpress Way (теория и практика)
Reactive UI на C#
Как приручить реактивное программирование
Объять необъятное, или как использовать несколько MVVM фреймворков в одном XA...
Как приручить реактивное программирование
Как приручить реактивное программирование в XAML приложениях
Живые приложения с Rx
Reactive Extensions
Разработка WPF приложений в стиле ViewModel First
MVVM в WinForms – DevExpress Way (теория и практика)

ReactiveUI: Rx + MVVM