ReactiveProperty.XamarinAndroid 9.5.0
dotnet add package ReactiveProperty.XamarinAndroid --version 9.5.0
NuGet\Install-Package ReactiveProperty.XamarinAndroid -Version 9.5.0
<PackageReference Include="ReactiveProperty.XamarinAndroid" Version="9.5.0" />
paket add ReactiveProperty.XamarinAndroid --version 9.5.0
#r "nuget: ReactiveProperty.XamarinAndroid, 9.5.0"
// Install ReactiveProperty.XamarinAndroid as a Cake Addin #addin nuget:?package=ReactiveProperty.XamarinAndroid&version=9.5.0 // Install ReactiveProperty.XamarinAndroid as a Cake Tool #tool nuget:?package=ReactiveProperty.XamarinAndroid&version=9.5.0
ReactiveProperty
ReactiveProperty 提供了在 Responsive 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 文档的“Getting Started”部分 中描述。
ReactiveProperty 的概念很简单,核心类名为 ReactiveProperty[Slim]
,它只是一个包装类,有一个值,并实现了 IObservable<T>
和 INotifyPropertyChanged
。其中 IObservable<T>
用于将属性值的变化事件连接到 Rx LINQ 方法变化,而 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问题区发布问题。我可以使用日语(第一语言)和英语(第二语言)。
如果发布的问题太多,那么我计划分别设置关于功能请求、问题、询问的发布地点。
作者信息
Yoshifumi Kawai,又称为@neuecc,是日本东京Cysharp, Inc的创始人/CEO/CTO。自2011年4月起获得微软开发者技术MVP奖项。他是ReactiveProperty的原创所有者。
Takaaki Suzuki,又称为@xin9le,是日本福井的软件开发人员。自2012年7月起获得微软开发者技术MVP奖项。
Kazuki Ota,又称为@okazuki,是日本东京的软件开发人员。从2011年7月到2017年2月获得微软Windows开发MVP奖项。现在在微软日本工作。
产品 | 版本 兼容和额外的计算目标框架版本。 |
---|---|
.NET | net7.0-android33.0 is compatible. net8.0-android was computed. net8.0-android34.0 is compatible. |
-
net7.0-android33.0
- ReactiveProperty (>= 9.5.0)
-
net8.0-android34.0
- ReactiveProperty (>= 9.5.0)
NuGet包
此包未由任何NuGet包使用。
GitHub仓库
此包未由任何流行的GitHub仓库使用。
版本 | 下载 | 最后更新 |
---|---|---|
9.5.0 | 102 | 2/28/2024 |
9.4.1 | 91 | 2/12/2024 |
9.4.0 | 111 | 2/11/2024 |
9.4.0-pre8 | 125 | 12/21/2023 |
9.4.0-pre7 | 80 | 12/21/2023 |
9.4.0-pre6 | 67 | 12/21/2023 |
9.4.0-pre5 | 75 | 12/21/2023 |
9.4.0-pre4 | 80 | 12/21/2023 |
9.3.4 | 237 | 10/30/2023 |
9.3.4-pre202310290551 | 109 | 10/29/2023 |
9.3.3 | 137 | 10/10/2023 |
9.3.2 | 134 | 9/25/2023 |
9.3.2-pre202309140728 | 111 | 9/14/2023 |
9.3.1 | 167 | 8/11/2023 |
9.3.0 | 167 | 7/31/2023 |
9.3.0-pre202307291429 | 142 | 7/29/2023 |
9.2.0 | 172 | 6/19/2023 |
9.2.0-pre202305241301 | 97 | 5/25/2023 |
9.1.2 | 251 | 3/12/2023 |
9.0.0 | 290 | 2/12/2023 |
9.0.0-pre202302040959 | 138 | 2/4/2023 |
9.0.0-pre202301080724 | 138 | 1/8/2023 |
9.0.0-pre202301050852 | 117 | 1/5/2023 |
8.2.0 | 377 | 11/10/2022 |
8.1.2 | 702 | 6/6/2022 |
8.1.2-pre202206051057 | 166 | 6/5/2022 |
8.1.1 | 465 | 5/27/2022 |
8.1.0 | 468 | 4/30/2022 |
8.1.0-pre202204290912 | 166 | 4/29/2022 |
8.1.0-pre202204290644 | 152 | 4/29/2022 |
8.0.5 | 492 | 3/24/2022 |
8.0.5-pre202203191529 | 177 | 3/19/2022 |
8.0.5-pre202203191312 | 158 | 3/19/2022 |
8.0.4 | 478 | 3/5/2022 |
8.0.4-pre202203040658 | 167 | 3/4/2022 |
8.0.3 | 387 | 12/5/2021 |
8.0.3-pre202112031043 | 867 | 12/3/2021 |
8.0.3-pre202112030833 | 839 | 12/3/2021 |
8.0.2 | 937 | 11/21/2021 |
8.0.1 | 539 | 11/20/2021 |
8.0.1-pre202111200140 | 563 | 11/20/2021 |
8.0.0 | 387 | 11/9/2021 |
8.0.0-pre202111090825 | 217 | 11/9/2021 |
8.0.0-pre202110240626 | 251 | 10/24/2021 |
8.0.0-pre202110161410 | 287 | 10/16/2021 |
8.0.0-pre202110160852 | 212 | 10/16/2021 |
8.0.0-pre202110160831 | 216 | 10/16/2021 |
8.0.0-pre202110131323 | 224 | 10/13/2021 |
8.0.0-pre202110071401 | 249 | 10/7/2021 |
8.0.0-pre202110060758 | 270 | 10/6/2021 |
8.0.0-pre202110060735 | 214 | 10/6/2021 |
8.0.0-pre202109190434 | 308 | 9/19/2021 |
8.0.0-pre202109160117 | 249 | 9/16/2021 |
8.0.0-pre202108141424 | 269 | 8/14/2021 |
8.0.0-pre202107040319 | 255 | 7/4/2021 |
7.12.0 | 1,912 | 8/6/2021 |
7.11.0 | 502 | 5/31/2021 |
7.10.0 | 446 | 4/29/2021 |
7.9.0 | 459 | 4/20/2021 |
7.8.3 | 501 | 3/24/2021 |
7.8.2 | 440 | 3/23/2021 |
7.8.1 | 480 | 3/11/2021 |
7.8.1-pre202103031133 | 277 | 3/3/2021 |
7.8.0 | 465 | 2/21/2021 |
7.8.0-pre202102210255 | 246 | 2/21/2021 |
7.8.0-pre202102201703 | 257 | 2/20/2021 |
7.7.1 | 428 | 2/19/2021 |
7.7.1-pre202102190925 | 260 | 2/19/2021 |
7.7.0 | 453 | 1/26/2021 |
7.6.1 | 472 | 1/15/2021 |
7.6.0 | 490 | 1/13/2021 |
7.5.1 | 617 | 10/19/2020 |
7.5.0 | 542 | 10/17/2020 |
7.5.0-pre202010141113 | 336 | 10/14/2020 |
7.4.1 | 567 | 9/23/2020 |
7.4.0 | 587 | 9/18/2020 |
7.3.0 | 541 | 9/17/2020 |
7.2.1 | 515 | 9/11/2020 |
7.2.0 | 547 | 8/4/2020 |
7.1.0 | 611 | 5/26/2020 |
7.1.0-pre202005251107 | 391 | 5/25/2020 |
7.0.1 | 587 | 5/14/2020 |
7.0.1-pre202005131606 | 391 | 5/13/2020 |
7.0.0 | 596 | 5/5/2020 |
7.0.0-ci20200503102823 | 407 | 5/3/2020 |
7.0.0-ci20200503100450 | 412 | 5/3/2020 |