ReactiveProperty.Blazor 9.6.0

dotnet add package ReactiveProperty.Blazor --version 9.6.0                
NuGet\Install-Package ReactiveProperty.Blazor -Version 9.6.0                
此命令旨在在 Visual Studio 的包管理器控制台中使用,因为它使用了 NuGet 模块的 Install-Package 的版本。
<PackageReference Include="ReactiveProperty.Blazor" Version="9.6.0" />                
对于支持 包引用 的项目,请将此 XML 节复制到项目文件以引用此包。
paket add ReactiveProperty.Blazor --version 9.6.0                
#r "nuget: ReactiveProperty.Blazor, 9.6.0"                
#r 指令可用于 F# Interactive 和 Polyglot Notebooks。将此内容复制到交互式工具或脚本的源代码中以引用该包。
// Install ReactiveProperty.Blazor as a Cake Addin
#addin nuget:?package=ReactiveProperty.Blazor&version=9.6.0

// Install ReactiveProperty.Blazor as a Cake Tool
#tool nuget:?package=ReactiveProperty.Blazor&version=9.6.0                

日语

ReactiveProperty

ReactiveProperty 在 Reactive Extensions 下提供 MVVM 和异步支持特性。目标框架为 .NET 6.0+、.NET Framework 4.7.2 和 .NET Standard 2.0。

alternate text is missing from this package README image alternate text is missing from this package README image Build and Release

ReactiveProperty overview

注意

如果您正在开发新应用,请考虑使用 R3 而不是 ReactiveProperty。R3 由作者重新设计,与当前的 .NET 生态系统兼容,并提供了一大部分在 ReactiveProperty 中发现的特性。

GitHub - Cysharp/R3

概念

ReactiveProperty 是一个非常强大且简单的库。

Delay and Select

此示例应用的 ViewModel 代码如下

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();
    }
}

它非常简单易懂(我认为!)。因为没有基类和接口。只在输入属性和输出属性之间有声明性代码。

所有步骤都在 ReactiveProperty 文档的“入门”部分 中介绍。

ReactiveProperty 的概念很简单,主要有核心类 ReactiveProperty[Slim],它只是一个包装类,有一个值,并实现了 IObservable<T>INotifyPropertyChangedIObservable<T> 用于将属性的更改事件连接到 Rx LINQ 方法的 chane,INotifyPropertyChanged 用于数据绑定系统,例如 WPF、WinUI 和 MAUI。

ReactiveProperty 的另一个重要概念是“有趣的编程”。使用 ReactiveProperty 的 ViewModel 代码非常简单。

ViewModel的流行实现

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)
        );
    }
}

绑定代码

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

使用ReactiveProperty的ViewModel实现

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

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

绑定代码

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

非常简单。

ReactiveProperty没有为ViewModel提供基类,这意味着ReactiveProperty可以与其他MVVM库一起使用,如Prism、Microsoft.Toolkit.Mvvm等。

文档

ReactiveProperty文档

NuGet包

包ID 版本和下载量 描述
ReactiveProperty alternate text is missing from this package README imagealternate text is missing from this package README image 该包包含所有核心功能。
ReactiveProperty.Core alternate text is missing from this package README imagealternate text is missing from this package README image 该包包含如ReactivePropertySlim<T>ReadOnlyReactivePropertySlim<T>等最少的类。并且它没有任何依赖项,甚至不包括System.Reactive。如果您不需要Rx功能,那么它非常适合。
ReactiveProperty.WPF alternate text is missing from this package README imagealternate text is missing from this package README image 该包包含适用于WPF的EventToReactiveProperty和EventToReactiveCommand。这是针对.NET 6或更高版本和.NET Framework 4.7.2或更高版本。
ReactiveProperty.Blazor alternate text is missing from this package README imagealternate text is missing from this package README image 该包包含具有ReactiveProperty验证功能的Blazor EditForm组件的验证支持。这是针对.NET 6.0或更高版本。

以下包处于维护阶段。

包ID 版本和下载量 描述
ReactiveProperty.UWP alternate text is missing from this package README imagealternate text is missing from this package README image 该包包含适用于UWP的EventToReactiveProperty和EventToReactiveCommand。
ReactiveProperty.XamarinAndroid alternate text is missing from this package README imagealternate text is missing from this package README image 该包包含针对Xamarin.Android本的许多扩展方法,以从事件创建IObservable。
ReactiveProperty.XamariniOS alternate text is missing from this package README imagealternate text is missing from this package README image 该包包含将ReactiveProperty和ReactiveCommand绑定到Xamarin.iOS原生控件的多个扩展方法。

支持

我不会关注StackOverflow和其他论坛以支持ReactiveProperty,因此请随时在Github issues处发布问题。我提供日语(第一语言)和英语(第二语言)。

如果发布的问题太多,那么我计划将关于功能请求、问题、问题的发布地点分开。

作者信息

Yoshifumi Kawai(昵称@neuecc)是东京Cysharp, Inc的创始人/CEO/CTO。自2011年4月起获得Microsoft MVP Developer Technologies奖。他是ReactiveProperty的原始拥有者。

Takaaki Suzuki(昵称@xin9le)是日本福井的软件开发者。自2012年7月起获得Microsoft MVP Developer Technologies奖。

Kazuki Ota(昵称@okazuki)是日本东京的软件开发者。自2011年7月至2017年2月获得Microsoft MVP Windows Development奖。现在在Microsoft日本工作。

产品 兼容和额外的计算目标框架版本。
.NET net8.0是兼容的。 net8.0-android已被计算。 net8.0-browser已被计算。 net8.0-ios已被计算。 net8.0-maccatalyst已被计算。 net8.0-macos已被计算。 net8.0-tvos已被计算。 net8.0-windows已被计算。
兼容的目标框架
包含的目标框架(在包中)
了解更多关于 目标框架.NET Standard

NuGet包

本包未被任何 NuGet 包使用。

GitHub 仓库

本包未被任何流行的 GitHub 仓库使用。

版本 下载 最后更新
9.6.0 99 7/14/2024
9.5.0 497 2/28/2024
9.4.1 158 2/12/2024
9.4.0 93 2/11/2024
9.4.0预发布8 135 12/21/2023
9.4.0预发布7 78 12/21/2023
9.4.0预发布6 68 12/21/2023
9.4.0预发布5 82 12/21/2023
9.4.0预发布4 57 12/21/2023
9.3.4 415 10/30/2023
9.3.4预发布202310290551 81 10/29/2023
9.3.3 164 10/10/2023
9.3.2 154 9/25/2023
9.3.2预发布202309140728 89 9/14/2023
9.3.1 385 8/11/2023
9.3.0 179 7/31/2023
9.3.0预发布202307291429 123 7/29/2023
9.2.0 537 6/19/2023
9.2.0预发布202305241301 119 5/25/2023
9.1.2 333 3/12/2023
9.0.0 308 2/12/2023
9.0.0预发布202302040959 110 2/4/2023
9.0.0预发布202301080724 136 1/8/2023
9.0.0预发布202301050852 141 1/5/2023
8.2.0 848 11/10/2022
8.1.2 649 6/6/2022
8.1.2预发布202206051057 154 6/5/2022
8.1.1 455 5/27/2022
8.1.0 566 4/30/2022
8.1.0预发布202204290912 168 4/29/2022