What is ReactiveProperty

July 5, 2026 ยท View on GitHub

ReactiveProperty provides MVVM and asynchronous support features for Reactive Extensions. The target framework is .NET Standard 2.0.

Summary

The concept of ReactiveProperty is Fun programming. You can write MVVM applications with ReactiveProperty. It's a lot of fun!

UWP

The following code shows two-way binding between a ReactiveProperty and a plain object property.

class Model : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private string _name;
    public string Name
    {
        get => _name;
        set
        {
            _name = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Name)));
        }
    }
}
class ViewModel
{
    private readonly Model _model = new Model();
    public ReactiveProperty<string> Name { get; }
    public ViewModel()
    {
        // Two-way synchronization between ReactiveProperty and the Model#Name property.
        Name = _model.ToReactivePropertyAsSynchronized(x => x.Name);
    }
}

ReactiveProperty is implemented through IObservable<T>. Yes! You can use LINQ.

var name = new ReactiveProperty<string>();
name.Where(x => x.StartsWith("_")) // filter
    .Select(x => x.ToUpper()) // convert
    .Subscribe(x => { ... some action ... });

ReactiveProperty is created from IObservable<T>.

class ViewModel
{
    public ReactiveProperty<string> Input { get; }
    public ReactiveProperty<string> Output { get; }

    public ViewModel()
    {
        Input = new ReactiveProperty("");
        Output = Input
            .Delay(TimeSpan.FromSeconds(1)) // Using an Rx method.
            .Select(x => x.ToUpper()) // Using a LINQ method.
            .ToReactiveProperty(); // Convert to ReactiveProperty
    }
}

This method chain is very cool.

We also provide the ReactiveCommand class, which implements the ICommand and IObservable<T> interfaces. ReactiveCommand can be created from an IObservable<bool>. The following sample creates a ReactiveCommand that can execute when the Input property is not empty.

class ViewModel
{
    public ReactiveProperty<string> Input { get; }
    public ReactiveProperty<string> Output { get; }

    public ReactiveCommand ResetCommand { get; }

    public ViewModel()
    {
        Input = new ReactiveProperty("");
        // Same as the sample above
        Output = Input
            .Delay(TimeSpan.FromSeconds(1)) // Using an Rx method.
            .Select(x => x.ToUpper()) // Using a LINQ method.
            .ToReactiveProperty(); // Convert to ReactiveProperty

        ResetCommand = Input.Select(x => !string.IsNullOrWhiteSpace(x)) // Convert ReactiveProperty<string> to IObservable<bool>
            .ToReactiveCommand() // You can create ReactiveCommand from IObservable<bool>. When a true value is published, the command can execute.
            .WithSubscribe(() => Input.Value = ""); // This is a shortcut for ResetCommand.Subscribe(() => ...)
    }
}

Cool! It is really declarative and clear.

Documentation contents

Getting started

Features

Advanced topics

Samples

Getting started

You can start using ReactiveProperty from the following links.

Learn the core features from the following links.

NuGet packages

Package IdVersion and downloadsDescription
ReactivePropertyThe package includes all core features, and the target platform is .NET Standard 2.0. It fits almost all situations.
ReactiveProperty.CoreThe package includes minimal classes such as ReactivePropertySlim<T> and ReadOnlyReactivePropertySlim<T>. It has no dependencies, not even System.Reactive. If you don't need Rx features, it fits.
ReactiveProperty.WPFThe package includes EventToReactiveProperty and EventToReactiveCommand for WPF. This is for .NET Core 3.0 or later and .NET Framework 4.7.2 or later.
ReactiveProperty.UWPThe package includes EventToReactiveProperty and EventToReactiveCommand for UWP.
ReactiveProperty.XamarinAndroidThe package includes many extension methods to create IObservable instances from events for Xamarin.Android native.
ReactiveProperty.XamariniOSThe package includes many extension methods to bind ReactiveProperty and ReactiveCommand to Xamarin.iOS native controls.