ReactiveProperty.XamarinAndroid 9.5.0

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

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 文档的“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库一起使用。

文档

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问题区发布问题。我可以使用日语(第一语言)和英语(第二语言)。

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

作者信息

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. 
兼容的目标框架
包含的目标框架(在包中)
了解更多关于目标框架.NET标准的信息。

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