ReactiveProperty.Core 9.6.0
dotnet add package ReactiveProperty.Core --version 9.6.0
NuGet\Install-Package ReactiveProperty.Core -Version 9.6.0
<PackageReference Include="ReactiveProperty.Core" Version="9.6.0" />
paket add ReactiveProperty.Core --version 9.6.0
#r "nuget: ReactiveProperty.Core, 9.6.0"
// 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。
注意
如果您正在开发一个新应用程序,请考虑使用 R3 而不是 ReactiveProperty。R3 是由原始作者重新设计的,与当前的 .NET 生态系统相一致,并提供了大多数在 ReactiveProperty 中找到的功能。
概念
ReactiveProperty 是一个功能强大且简单的库。
本示例应用的 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>
和 INotifyPropertyChanged
,IObservable<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 库一起使用。
文档
NuGet 包
包 ID | 版本和下载 | 描述 |
---|---|---|
ReactiveProperty | 该包包括所有核心功能。 | |
ReactiveProperty.Core | 该包包括最小化类,如 ReactivePropertySlim<T> 和 ReadOnlyReactivePropertySlim<T> 。这不需要对 System.Reactive 的任何依赖。如果您不需要 Rx 功能,那么它非常适合。 |
|
ReactiveProperty.WPF | 该包包括为 WPF 提供的 EventToReactiveProperty 和 EventToReactiveCommand。这是针对 .NET 6 或更高版本和 .NET Framework 4.7.2 或更高版本。 | |
ReactiveProperty.Blazor | 该包包括对 Blazor 的 EditForm 组件的验证支持,具有 ReactiveProperty 验证功能。这是针对 .NET 6.0 或更高版本。 |
以下包处于维护阶段。
包 ID | 版本和下载 | 描述 |
---|---|---|
ReactiveProperty.UWP | 该包包括为 UWP 提供的 EventToReactiveProperty 和 EventToReactiveCommand。 | |
ReactiveProperty.XamarinAndroid | 该包包括用于 Xamarin.Android 原生的许多扩展方法,以从事件创建 IObservable。 | |
ReactiveProperty.XamariniOS | 该包包括将 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 |
-
.NETFramework 4.7.2
- System.ComponentModel.Annotations (>= 5.0.0)
-
.NETStandard 2.0
- System.ComponentModel.Annotations (>= 5.0.0)
-
net6.0
- System.ComponentModel.Annotations (>= 5.0.0)
-
net8.0
- System.ComponentModel.Annotations (>= 5.0.0)
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 |