ReactiveProperty.Blazor 9.6.0
dotnet add package ReactiveProperty.Blazor --version 9.6.0
NuGet\Install-Package ReactiveProperty.Blazor -Version 9.6.0
<PackageReference Include="ReactiveProperty.Blazor" Version="9.6.0" />
paket add ReactiveProperty.Blazor --version 9.6.0
#r "nuget: ReactiveProperty.Blazor, 9.6.0"
// 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。
注意
如果您正在开发新应用,请考虑使用 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 方法的 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等。
文档
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 | 该包包含具有ReactiveProperty验证功能的Blazor EditForm组件的验证支持。这是针对.NET 6.0或更高版本。 |
以下包处于维护阶段。
包ID | 版本和下载量 | 描述 |
---|---|---|
ReactiveProperty.UWP | 该包包含适用于UWP的EventToReactiveProperty和EventToReactiveCommand。 | |
ReactiveProperty.XamarinAndroid | 该包包含针对Xamarin.Android本的许多扩展方法,以从事件创建IObservable。 | |
ReactiveProperty.XamariniOS | 该包包含将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已被计算。 |
-
net8.0
- Microsoft.AspNetCore.Components.Web (>= 8.0.7)
- ReactiveProperty (>= 9.6.0)
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 |