ReactiveProperty.Core 9.6.0

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

// Install ReactiveProperty.Core as a Cake Tool
#tool nuget:?package=ReactiveProperty.Core&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 的 change 方法,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 可以与 Prism、Microsoft.Toolkit.Mvvm 等其他 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 该包包括对 Blazor 的 EditForm 组件的验证支持,具有 ReactiveProperty 验证功能。这是针对 .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 issue 中发布问题。我可用日语(第一语言)和英语(第二语言)。

如果发布的问题太多,那么我计划为功能请求、问题、问题分离发布位置。

作者信息

Yoshifumi Kawai(别称 @neuecc)是日本东京 CyberNoboru,Inc 的创始人/CEO/CTO。自 2011 年 4 月以来获得 Microsoft MVP(开发者技术)奖。他是 ReactiveProperty 的原始所有者。

Takaaki Suzuki(别称 @xin9le)是日本福井的软件开发人员。自 2012 年 7 月以来获得 Microsoft MVP(开发者技术)奖。

Kazuki Ota(别称 @okazuki)是日本东京的软件开发人员。2011 年 7 月至 2017 年 2 月期间获得 Microsoft MVP(Windows 开发)奖。现在在微软日本工作。

产品 兼容和额外的计算目标框架版本。
.NET net5.0 已计算。 net5.0-windows 已计算。 net6.0 兼容。 net6.0-android 已计算。 net6.0-ios 已计算。 net6.0-maccatalyst 已计算。 net6.0-macos 已计算。 net6.0-tvos 已计算。 net6.0-windows 已计算。 net7.0 已计算。 net7.0-android 已计算。 net7.0-ios 已计算。 net7.0-maccatalyst 已计算。 net7.0-macos 已计算。 net7.0-tvos 已计算。 net7.0-windows 已计算。 net8.0 兼容。 net8.0-android 已计算。 net8.0-browser 已计算。 net8.0-ios 已计算。 net8.0-maccatalyst 已计算。 net8.0-macos 已计算。 net8.0-tvos 已计算。 net8.0-windows 已计算。
.NET Core netcoreapp2.0 已计算。 netcoreapp2.1 已计算。 netcoreapp2.2 已计算。 netcoreapp3.0 已计算。 netcoreapp3.1 已计算。
.NET Standard netstandard2.0 兼容。 netstandard2.1 已计算。
.NET Framework
MonoAndroid
MonoMac
MonoTouch
Tizen
Xamarin.iOS
Xamarin.Mac
Xamarin.TVOS
Xamarin.WatchOS
了解更多关于 目标框架.NET 标准化

NuGet 包 (2)

显示依赖 ReactiveProperty.Core 的前 2 个 NuGet 包

下载
ReactiveProperty

ReactiveProperty 是 Reactive Extensions (System.Reactive) 的 MVVM 和异步扩展。

ReduxDotnet

为 .NET 6 提供类型安全的 Redux 实现。

GitHub 仓库 (1)

显示依赖 ReactiveProperty.Core 的最受欢迎的 1 个 GitHub 仓库

仓库 星星
leezer3/OpenBVE
OpenBVE - 一个免费的火车模拟器
版本 下载 最后更新
9.6.0 2,010 7/14/2024
9.5.0 22,609 2/28/2024
9.4.1 4,648 2/12/2024
9.4.0 795 2/11/2024
9.4.0-pre8 567 12/21/2023
9.4.0-pre7 341 12/21/2023
9.4.0-pre6 345 12/21/2023
9.4.0-pre5 322 12/21/2023
9.4.0-pre4 334 12/21/2023
9.3.4 24,424 10/30/2023
9.3.4-pre202310290551 416 10/29/2023
9.3.3 3,022 10/10/2023
9.3.2 6,835 9/25/2023
9.3.2-pre202309140728 524 9/14/2023
9.3.1 13,196 8/11/2023
9.3.0 3,061 7/31/2023
9.3.0-pre202307291429 621 7/29/2023
9.2.0 10,157 6/19/2023
9.2.0-pre202305241301 704 5/25/2023
9.1.2 25,207 3/12/2023
9.1.0 1,437 3/12/2023
9.0.0 9,752 2/12/2023
9.0.0-pre202302040959 664 2/4/2023
9.0.0-pre202301080724 790 1/8/2023
9.0.0-pre202301050852 667 1/5/2023
8.2.0 33,819 11/10/2022
8.1.2 51,857 6/6/2022
8.1.2-pre202206051057 649 6/5/2022
8.1.1 4,777 5/27/2022
8.1.0 5,485 4/30/2022
8.1.0-pre202204290912 636 4/29/2022
8.1.0-pre202204290644 655 4/29/2022
8.0.5 12,791 3/24/2022
8.0.5-pre202203191529 691 3/19/2022
8.0.5-pre202203191312 646 3/19/2022
8.0.4 15,190 3/5/2022
8.0.4-pre202203040658 698 3/4/2022
8.0.3 40,813 12/5/2021
8.0.3-pre202112031043 1,391 12/3/2021
8.0.3-pre202112030833 1,338 12/3/2021
8.0.2 5,235 11/21/2021
8.0.1 1,600 11/20/2021
8.0.1-pre202111200140 1,044 11/20/2021
8.0.0 43,416 11/9/2021
8.0.0-pre202111090825 788 11/9/2021
8.0.0-pre202110240626 2,080 10/24/2021
8.0.0-pre202110161410 946 10/16/2021
8.0.0-pre202110160852 772 10/16/2021
8.0.0-pre202110160831 788 10/16/2021
8.0.0-pre202110131323 833 10/13/2021
8.0.0-pre202110071401 839 10/7/2021
8.0.0-pre202110060758 865 10/6/2021
8.0.0-pre202110060735 705 10/6/2021
8.0.0-pre202109190434 905 9/19/2021
8.0.0-pre202109160117 831 9/16/2021
8.0.0-pre202108141424 911 8/14/2021
8.0.0-pre202107040319 1,359 7/4/2021
7.12.0 45,252 8/6/2021
7.11.0 13,705 5/31/2021
7.10.0 11,047 4/29/2021
7.9.0 15,651 4/20/2021
7.8.3 11,873 3/24/2021
7.8.2 1,788 3/23/2021
7.8.1 4,086 3/11/2021
7.8.1-pre202103031133 922 3/3/2021
7.8.0 7,445 2/21/2021
7.8.0-pre202102210255 812 2/21/2021
7.8.0-pre202102201703 825 2/20/2021
7.7.1 2,134 2/19/2021
7.7.1-pre202102190925 846 2/19/2021
7.7.0 19,004 1/26/2021
7.6.1 4,433 1/15/2021
7.6.0 235,814 1/13/2021
7.5.1 43,852 10/19/2020
7.5.0 1,825 10/17/2020
7.5.0-pre202010141113 904 10/14/2020
7.4.1 22,992 9/23/2020
7.4.0 2,447 9/18/2020
7.3.0 1,996 9/17/2020
7.2.1 26,443 9/11/2020
7.2.0 52,983 8/4/2020
7.1.0 63,885 5/26/2020
7.1.0-pre202005251107 982 5/25/2020
7.0.1 3,950 5/14/2020
7.0.1-pre202005131606 957 5/13/2020
7.0.0 5,325 5/5/2020
7.0.0-ci20200503102823 984 5/3/2020
7.0.0-ci20200503100450 983 5/3/2020