首页 > 其他分享 >ReactiveProperty入门

ReactiveProperty入门

时间:2023-03-10 17:14:20浏览次数:54  
标签:IObservable 入门 ReactiveProperty get ViewModel Input public

什么是ReactiveProperty

ReactiveProperty在Reactive Extensions下支持异步功能。目标框架是 .NET Standard 2.0。

ReactiveProperty的理念是有趣的编程. 您可以使用 ReactiveProperty 编写 MVVM 模式程序。这非常有趣!

例子中xaml代码如下:

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:viewModels="clr-namespace:WpfApp1.ViewModels"
        mc:Ignorable="d"
        Title="GettingStartedUWP" Height="450" Width="800">
    <!--可以看作是画面相关数据的数据集-->
    <Window.DataContext>
        <viewModels:ViewModel/>
    </Window.DataContext>
    <StackPanel Margin="10">
        <Label Content="Input:" />
        <!--绑定数据源更新的触发器为PropertyChanged,即画面数据发生变化时,触发绑定的数据源更新-->
        <TextBox Text="{Binding Input.Value, UpdateSourceTrigger=PropertyChanged}" />
        <Label Content="Output:" />
        <TextBlock Text="{Binding Output.Value}" />
    </StackPanel>
</Window>

例子的ViewModel代码如下:

class ViewModel
{
    public ReactiveProperty<string> Input { get; }
    public ReactiveProperty<string> Output { get; }

    public ViewModel()
    {
        Input = new ReactiveProperty("");
        Output = Input
            .Delay(TimeSpan.FromSecond(1)) // 响应式方法,可设置响应延时
            .Select(x => x.ToUpper()) // 返回结果设置为大写
            .ToReactiveProperty(); // 转化为ReactiveProperty
    }
}

由于ReactiveProperty 是继承自IObservable<T>. 所以我们可以使用 LINQ。

var name = new ReactiveProperty<string>();
name.Where(x => x.StartsWith("_"))
    .Select(x => x.ToUpper())
    .Subscribe(x => { ... some action ... });

ReactiveProperty提供了ReactiveCommand,它是实现了ICommandIObservable<T>接口的类。
以下示例创建了一个ReactiveCommand,它可以在Input不为空的时候执行。

例子中xaml代码如下

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:viewModels="clr-namespace:WpfApp1.ViewModels"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.DataContext>
        <viewModels:ViewModel/>
    </Window.DataContext>
    <StackPanel Margin="10">
        <Label Content="Input:" />
        <TextBox Text="{Binding Input.Value, UpdateSourceTrigger=PropertyChanged}" />
        <Label Content="Output:" />
        <TextBlock Text="{Binding Output.Value}" />
        <Button Content="Click me" Command="{Binding ResetCommand}" />
    </StackPanel>
</Window>

c#代码如下:

class ViewModel
{
    public ReactiveProperty<string> Input { get; }
    public ReactiveProperty<string> Output { get; }

    public ReactiveCommand ResetCommand { get; }

    public ViewModel()
    {
        Input = new ReactiveProperty("");
        Output = Input
            .Delay(TimeSpan.FromSecond(1))
            .Select(x => x.ToUpper()) 
            .ToReactiveProperty();
        
        ResetCommand = Input.Select(x => !string.IsNullOrWhitespace(x)) // 将ReactiveProperty<string>转化为IObservable<bool>
            .ToReactiveCommand() // 当bool值为true时,ResetCommand绑定的按钮可执行
            .WithSubscribe(() => Input.Value = ""); // ReactCommand执行的业务
    }
}

ReactiveProperty的NuGet包

包名 概述
ReactiveProperty 该包包含所有核心功能,目标平台为 .NET Standard 2.0。它几乎适用于所有情况。
ReactiveProperty.Core 该包包括最少的类,例如ReactivePropertySlim<T>ReadOnlyReactivePropertySlim<T>。这甚至没有任何依赖关系 System.Reactive。如果您不需要 Rx 功能,那么它很适合。
ReactiveProperty.WPF 该包包括用于 WPF 的 EventToReactiveProperty 和 EventToReactiveCommand。这适用于 .NET Core 3.0 或更高版本以及 .NET Framework 4.6.1 或更高版本。
ReactiveProperty.UWP 该包包括用于 UWP 的 EventToReactiveProperty 和 EventToReactiveCommand。

PS:导包的时候一定要根据自身所选择的开发平台来进行包的选择

创建ReactiveProperty实例

构造函数创建

使用构造函数是最简单的方法。

var name = new ReactiveProperty<string>();

实现IObservable<T>接口

通过实现IObservable<T>接口,调用ToReactiveProperty方法

IObservable<long> observableInstance = Observable.Interval(TimeSpan.FromSeconds(1));
ReactiveProperty<long> counter = observableInstance.ToReactiveProperty();

以下为ReactiveProperty的官方文档,可供大家深入了解

Reactive Document

标签:IObservable,入门,ReactiveProperty,get,ViewModel,Input,public
From: https://www.cnblogs.com/tutaotao/p/17203078.html

相关文章

  • Datadog 入门:开发人员监控
    介绍Datadog是一款专为云时代的应用程序而设计的监控和分析平台,它可以帮助开发人员、IT运营团队和业务用户实现对整个技术堆栈的统一、实时的可观察性。Datadog的Saa......
  • Angular 独立组件入门
    Angular独立组件入门如果你正在学习​​Angular​​,那么你可能已经听说过独立组件(Component)。顾名思义,独立组件就是可以独立使用和管理的组件,它们能够被包含在其他组件中......
  • java中的特殊文件、日志技术、多线程入门
    一,属性文件(.properties)1,特殊文件概述(必会)我们知道IO流是用来读数据,目的是为了获取其中的信息供我们使用,但是普通的txt文件是杂乱无章的,除非我们规定,自己写。虽然可以但......
  • cadence入门学习第二章之原理图绘制
    原理图的新建与添加1、新建工程工程以obj文件结尾!!!!Lib中是没有的!!!添加后才会有!!!!......
  • Cadence入门学习第一章之软件操作及元器件库
    软件操作界面1、orCADCaptureCIS界面设置2、颜色设置需要重新启动软件才可以生效!!!打勾是输出为PDF版本时,输出的。不打勾不会输出。3、栅格点设置抓取格点设置......
  • keras图片数字识别入门AI机器学习
    通过使用mnist(AI界的helloworld)手写数字模型训练集,了解下AI工作的基本流程。本例子,要基于mnist数据集(该数据集包含了【0-9】的模型训练数据集和测试数据集)来完成一个手写......
  • 2023 最新 Three.js 快速入门教程 All In One
    2023最新Three.js快速入门教程AllInOneThree.js核心概念Shader着色器Render渲染器材质贴图纹理骨骼动画网格几何体模型灯光摄像机相机场景舞台......
  • [java-Spring]-Spring Boot入门基本操作
    目录一、SpringBoot入门1、SpringBoot简介2、微服务3、环境准备1、MAVEN设置;2、IDEA设置4、SpringBootHelloWorld1、创建一个maven工程;(jar)2、导入springboot相关的......
  • Celery框架从入门到精通
    目录Celery介绍、安装、基本使用一、Celery服务1、celery架构2、celery快速使用二、Celer包结构1、创建clery包结构2、Celery执行异步任务、延迟任务、定时任务三、Django......
  • Opengl入门基础(七)-数学基础
    opengl除了基础的模型构建和贴图,还需要进行位置变换,缩放等功能,之前定义的顶点坐标(0,0.5,0),纹理坐标(0,0.5)实际上是一个向量,而对多个坐标构成的模型进行变换、缩放实际上是向量与......