• Stars
    star
    889
  • Rank 51,033 (Top 2 %)
  • Language
    C#
  • License
    MIT License
  • Created almost 10 years ago
  • Updated 3 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

ReactiveProperty provides MVVM and asynchronous support features under Reactive Extensions. Target frameworks are .NET 6+, .NET Framework 4.7.2 and .NET Standard 2.0.

Japanese

ReactiveProperty

ReactiveProperty provides MVVM and asynchronous support features under Reactive Extensions. Target framework is .NET 6.0+, .NET Framework 4.7.2 and .NET Standard 2.0.

Build and Release

ReactiveProperty overview

ReactiveProperty is a very powerful and simple library.

Delay and Select

This sample app's ViewModel code is as below:

public class MainPageViewModel
{
    public ReactivePropertySlim<string> Input { get; }
    public ReadOnlyReactivePropertySlim<string> Output { get; }
    public MainPageViewModel()
    {
        Input = new ReactivePropertySlim<string>("");
        Output = Input
            .Delay(TimeSpan.FromSeconds(1))
            .Select(x => x.ToUpper())
            .ObserveOnDispatcher()
            .ToReadOnlyReactivePropertySlim();
    }
}

It is really simple and understandable (I think!). Because there are NOT any base classes and interfaces. Just has declarative code between Input property and Output property.

All steps are written in the "Getting Started" section in the ReactiveProperty documentation.

The concept of ReactiveProperty is simple that is a core class what name is ReactiveProperty[Slim], it is just a wrap class what has a value, and implements IObservable<T> and INotifyPropertyChanged, IObservable<T> is for connect change event of the property value to Rx LINQ method chane, INotifyPropertyChanged is for data binding system such as WPF, WinUI and MAUI.

And an important concept of ReactiveProperty is "Fun programing". ViewModel code with ReactiveProperty is very simple.

ViewModel's popular implementation:

public class AViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private string _name;
    public string Name
    {
        get => _name;
        set
        {
            _name = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Name)));

            // Update a command status
            DoSomethingCommand.RaiseCanExecuteChanged();
        }
    }

    private string _memo;
    public string Memo
    {
        get => _memo;
        set
        {
            _memo = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Memo)));

            // Update a command status
            DoSomethingCommand.RaiseCanExecuteChanged();
        }
    }

    // DelegateCommand is plane ICommand implementation.
    public DelegateCommand DoSomethingCommand { get; }

    public AViewModel()
    {
        DoSomethingCommand = new DelegateCommand(
            () => { ... },
            () => !string.IsNullOrEmpty(Name) && !string.IsNullOrEmpty(Memo)
        );
    }
}

Binding code:

<TextBlock Text="{Binding Name}">
<TextBlock Text="{Binding Memo}">

ViewModel's implementation using ReactiveProperty:

public class AViewModel
{
    public ReactivePropertySlim<string> Name { get; }
    public ReactivePropertySlim<string> Memo { get; }
    public ReactiveCommandSlim DoSomethingCommand { get; }

    public AViewModel()
    {
        Name = new ReactiveProperty<string>()
            .SetValidateNotifyError(x => string.IsNullOrEmpty(x) ? "Invalid value" : null);
        Memo = new ReactiveProperty<string>()
            .SetValidateNotifyError(x => string.IsNullOrEmpty(x) ? "Invalid value" : null);
        DoSomethingCommand = new[]
            {
                Name.ObserveHasErrors,
                Memo.ObserveHasErrors,
            }
            .CombineLatestValuesAreAllFalse()
            .ToReactiveCommand()
            .WithSubscribe(() => { ... });
    }
}

Binding code:

<TextBlock Text="{Binding Name.Value}">
<TextBlock Text="{Binding Memo.Value}">

It's very simple.

ReactiveProperty doesn't provide base class by ViewModel, which means that ReactiveProperty can be used together with another MVVM libraries such as Prism, Microsoft.Toolkit.Mvvm and etc.

Documentation

ReactiveProperty documentation

NuGet packages

Package Id Version and downloads Description
ReactiveProperty The package includes all core features.
ReactiveProperty.Core The package includes minimum classes such as ReactivePropertySlim<T> and ReadOnlyReactivePropertySlim<T>. And this doesn't have any dependency even System.Reactive. If you don't need Rx features, then it fits.
ReactiveProperty.WPF The package includes EventToReactiveProperty and EventToReactiveCommand for WPF. This is for .NET 6 or later and .NET Framework 4.7.2 or later.
ReactiveProperty.Blazor The package includes validation support for EditForm component of Blazor with ReactiveProperty validation feature. This is for .NET 6.0 or later.

Following packages are maitanance phase.

Package Id Version and downloads Description
ReactiveProperty.UWP The package includes EventToReactiveProperty and EventToReactiveCommand for UWP.
ReactiveProperty.XamarinAndroid The package includes many extension methods to create IObservable from events for Xamarin.Android native.
ReactiveProperty.XamariniOS The package includes many extension methods to bind ReactiveProperty and ReactiveCommand to Xamarin.iOS native controls.

Support

I'm not watching StackOverflow and other forums to support ReactiveProperty, so please feel free to post questions at Github issues. I'm available Japanese(1st language) and English(2nd language).

If too many questions are posted, then I plan to separate posting place about feature requests, issues, questions.

Author info

Yoshifumi Kawai a.k.a. @neuecc is Founder/CEO/CTO of Cysharp, Inc in Tokyo, Japan. Awarded Microsoft MVP for Developer Technologies since April, 2011. He is an original owner of ReactiveProperty.

Takaaki Suzuki a.k.a. @xin9le software developer in Fukui, Japan. Awarded Microsoft MVP for Developer Technologies since July, 2012.

Kazuki Ota a.k.a. @okazuki software developer in Tokyo, Japan. Awarded Microsoft MVP for Windows Development since July 2011 to Feb 2017. Now, working at Microsoft Japan.

More Repositories

1

Livet

WPF MVVM Infrastructure.
C#
244
star
2

PrismEdu

Japanese Prism library learning memo.
C#
151
star
3

VueJsAndAspNetCore

C#
42
star
4

samples

sample applications
C#
25
star
5

plantumlpreview

TypeScript
15
star
6

AsyncMessenger

MVVM Light Messenger extension.
C#
9
star
7

VirtualCOMPortApp

C#
8
star
8

DesktopBridgeAppService

DesktopBridge で UWP と Win32 のプロセス間の通信サンプル
C#
7
star
9

ReactivePrism

C#
6
star
10

ServerlessWebSocketServer

C#
5
star
11

MVVMRxSample

MVVM + Prism + Reactive Extensions sample application
5
star
12

uwptodoapp

todo app
PowerShell
5
star
13

EmbeddedMsalCustomWebUi.Wpf

C#
4
star
14

gRPCSampleApps

C#
4
star
15

LaunchRemoteHoloApp

C#
4
star
16

techsummit2018japan

C++
3
star
17

ASPNETIdentity

ASP.NET Identity custom sample application
C#
3
star
18

acs-labs

TypeScript
3
star
19

NewRegionManagerPopupWindowSampleApp

C#
3
star
20

Yubaba.Uno

C#
3
star
21

dotnet6_blazorwebview_wpf

C#
3
star
22

WindowsMLWPFSample

C#
2
star
23

CSharpTokyo20201127WinMLDemo

2
star
24

CognitiveServicesSample

Microsoft Cognitive Servicesを使用したサンプルアプリケーションです。
C#
2
star
25

winstoreapprecipe

C#
2
star
26

metroapps

C#
2
star
27

PrismChildRegionManagerSampleApp

PrismのRegionManagerを子Windowで使う場合のサンプル
C#
2
star
28

RichTextBoxBinding

C#
2
star
29

botfw-directlinesample

C#
2
star
30

ChatGptLikeBlazorApp

C#
2
star
31

ReactivePropertyComboBoxSample

C#
2
star
32

RxSmallLab

C#
2
star
33

SmileXamarinApp

Xamarin and Congnitive Service sample
C#
2
star
34

BotFw-DirectLineSample-WebSocket

C#
1
star
35

BlobStorageExplorer

C#
1
star
36

WPFPrismUserControlSample

C#
1
star
37

win8behavior

Windows 8のIBehaviorやIActionを拡張してなるべく今までのBehviorと同じノリで新しいビヘイビアを追加できるようにしたもの
C#
1
star
38

ReduxDotnet

Type safe redux implementation for .NET
C#
1
star
39

blazor-static-web-apps

HTML
1
star
40

RemoveItemUsingContextMenuOnWPF

C#
1
star
41

UniRxProperty

C#
1
star
42

CompiletimeBinding

UWP Compiletime Binding sample application
C#
1
star
43

TypeScriptJSXReduxTodo

JavaScript
1
star
44

UpdateListViewItemApp

C#
1
star
45

LearningAWSLambda

Dockerfile
1
star
46

dotnet-core-wpf-adal-sample

C#
1
star
47

ODataSample

OData Sample Application(WCF RIA Services)
C#
1
star
48

TypeScriptJSXExpressAndReact

JavaScript
1
star
49

Livet-samples

This repository is for samples of Livet.
C#
1
star
50

decode2018

de:code 2018 よう
C#
1
star
51

XFAI

C#
1
star
52

TreeViewScrollSample

C#
1
star
53

MSGraphAPISampleApp

C#
1
star
54

PrismXFNavigationIssueRepro

C#
1
star
55

BindingEnums

C#
1
star
56

WinMRSignalR

C#
1
star
57

INotifyPropertyChangedImplementationGenerator

C#
1
star
58

GyutanKaigi2019

C#
1
star
59

reactiveproperty-advanced-validation-sample

C#
1
star
60

Decode2020.Cli

C#
1
star
61

VueJsIdentityServer4

C#
1
star
62

MVVMPorting

C#
1
star
63

UWPTileNotification

UWP NotificationsExtensions sample
C#
1
star
64

ParallaxScrollUWP

C#
1
star
65

MvvmGenerator

C#
1
star
66

sync-rp-oneway-uwp

C#
1
star
67

VueASPNETCore

C#
1
star
68

SkiaOnWinForms

C#
1
star
69

mangaclovalab

C#
1
star
70

TypeScriptJSXBootstrapAndRouter

JavaScript
1
star
71

UWPTextBlockSample

C#
1
star
72

FunctionalMapReduceSample

Haskell -> C#
C#
1
star
73

GrpcNetCoreSample

C#
1
star
74

CustomPropertyProviderApp

C#
1
star
75

DirectLineClient

C#
1
star
76

OkazukiSampleApi

練習用サンプルAPI
JavaScript
1
star
77

PrismUnoSampleApp

C#
1
star
78

DataTableBenchmark

C#
1
star
79

WP7Apps

my windows phone 7 application
C#
1
star