ReactiveX 学习笔记(21)使用 Rx.NET + ReactiveUI 进行 GUI 编程
课题
- 程序界面由3个文本编辑框和1个文本标签组成。
- 要求文本标签实时显示3个文本编辑框所输入的数字之和。
- 文本编辑框输入的不是合法数字时,将其值视为0。
- 3个文本编辑框的初值分别为1,2,3。
创建工程
打开 Visual Studio,File / New / Project...
新建一个名为 RxExample 的 WPF 应用程序。
ReactiveUI
打开 NuGet 包管理器,搜索并安装 ReactiveUI 以及 ReactiveUI.Fody 这两个包。
AppViewModel
在工程中添加 AppViewModel 类,内容如下
using ReactiveUI;
using ReactiveUI.Fody.Helpers;
namespace RxExample
{
    public class AppViewModel : ReactiveObject
    {
        [Reactive]
        public string Number1 { get; set; } = "1";
        [Reactive]
        public string Number2 { get; set; } = "2";
        [Reactive]
        public string Number3 { get; set; } = "3";
        public string Result { [ObservableAsProperty] get; }
        public AppViewModel()
        {
            int f(string s) =>
                int.TryParse(s, out var o) ? o : 0;
            this.WhenAnyValue(x => x.Number1, x => x.Number2, x => x.Number3,
                (s1, s2, s3) => (f(s1) + f(s2) + f(s3)).ToString())
                .ToPropertyEx(this, x => x.Result);
        }
    }
}
MainWindow
将程序界面 MainWindow.xaml 的内容改为
<Window x:Class="RxExample.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:local="clr-namespace:RxExample"
        mc:Ignorable="d"
        Title="MainWindow" Height="200" Width="300">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>
        <TextBox Grid.Column="1" Margin="10" Text="{Binding Number1, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="120" TextAlignment="Right"/>
        <TextBox Grid.Column="1" Margin="10" Grid.Row="1" Text="{Binding Number2, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="120" TextAlignment="Right"/>
        <TextBlock Margin="10" Grid.Row="2" Text="+" />
        <TextBox Grid.Column="1" Margin="10" Grid.Row="2" Text="{Binding Number3, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="120" TextAlignment="Right"/>
        <TextBlock Grid.Column="1" Margin="10" Grid.Row="3" Text="{Binding Result}" TextAlignment="Right"/>
    </Grid>
</Window>
打开 MainWindow.xaml.cs 文件,在 MainWindow的构造方法中添加以下代码
DataContext = new AppViewModel();
ReactiveX 学习笔记(21)使用 Rx.NET + ReactiveUI 进行 GUI 编程的更多相关文章
- ReactiveX 学习笔记(0)学习资源
		ReactiveX 学习笔记 ReactiveX 学习笔记(1) ReactiveX 学习笔记(2)创建数据流 ReactiveX 学习笔记(3)转换数据流 ReactiveX 学习笔记(4)过滤数据 ... 
- Ext.Net学习笔记21:Ext.Net FormPanel 字段验证(validation)
		Ext.Net学习笔记21:Ext.Net FormPanel 字段验证(validation) 作为表单,字段验证当然是不能少的,今天我们来一起看看Ext.Net FormPanel的字段验证功能. ... 
- SQL反模式学习笔记21  SQL注入
		目标:编写SQL动态查询,防止SQL注入 通常所说的“SQL动态查询”是指将程序中的变量和基本SQL语句拼接成一个完整的查询语句. 反模式:将未经验证的输入作为代码执行 当向SQL查询的字符串中插入别 ... 
- ArcGIS API for JavaScript 4.2学习笔记[21] 对3D场景上的3D要素进行点击查询【Query类学习】
		有人问我怎么这个系列没有写自己做的东西呢? 大哥大姐,这是"学习笔记"啊!当然主要以解读和笔记为主咯. 也有人找我要实例代码(不是示例),我表示AJS尚未成熟,现在数据编辑功能才简 ... 
- [原创]java WEB学习笔记21:MVC案例完整实践(part 2)---DAO层设计
		本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ... 
- qt学习笔记(五) QGraphicsPixmapItem与QGraphicsScene的编程实例 图标拖动渐变效果
		应大家的要求,还是把完整的project文件贴出来,大家省点事:http://www.kuaipan.cn/file/id_48923272389086450.htm 先看看执行效果,我用的群创7寸屏 ... 
- #Python学习笔记:1-3章 (基于《python编程,从入门到实践)
		第1-3章 这个文档是记录我学习python时一些学习笔记以及一些想法也可以称作复习笔记 第一章:起步这一章主要是从第一个"hello world"程序到python环境的搭建与配 ... 
- ReactiveX 学习笔记(15)使用 Rx.NET + Json.NET 调用 REST API
		JSON : Placeholder JSON : Placeholder (https://jsonplaceholder.typicode.com/) 是一个用于测试的 REST API 网站. ... 
- ReactiveX 学习笔记(24)使用 RxCpp + C++ REST SDK 调用 REST API
		JSON : Placeholder JSON : Placeholder (https://jsonplaceholder.typicode.com/) 是一个用于测试的 REST API 网站. ... 
随机推荐
- 脱产班第五次大作业-FTP服务器
			下载项目 my_ftp #!/usr/bin/env python3 # -*- coding: utf-8 -*- import os import hmac import json import ... 
- 机器视觉:SSD Single Shot MultiBox Detector
			今天介绍目标检测中非常著名的一个框架 SSD,与之前的 R-CNN 系列的不同,而且速度比 YOLO 更快. SSD 的核心思想是将不同尺度的 feature map 分成很多固定大小的 box,然后 ... 
- Python全栈之路----函数进阶----作用域的查找空间
			n = 10 def func(): n = 20 print('func:',n) def func2(): n = 30 print('func2:',n) def func3(): print( ... 
- C++之string类型详解
			C++之string类型详解 之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必担心内存是否足够.字符串长度等等,而且作为一个泛型类出现,他集成的操作函 ... 
- hdu 1754 I Hate It (单点修改+区间最值+裸题)
			Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ... 
- 在jsp中应如何避免,request.getContextPath();等get报错问题
			导致request中的大部分get方法无法获取,是因为没有依赖的jar包.就像这样.这里不仅仅有getContextPath()方法报错,如果存在这个问题,大部分的request方法都不可用. 解决这 ... 
- 全志A33 linux led驱动编程(附实测参考代码)
			开发平台 * 芯灵思SinlinxA33开发板 淘宝店铺: https://sinlinx.taobao.com/ 嵌入式linux 开发板交流 QQ:641395230 开发平台 * 芯灵思Sinl ... 
- C# 以共享只读方式打开被其它程序占用的文件
			iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open, System.IO.FileAccess.Read, Sys ... 
- asp.net core 基于角色的认证登陆
			一.登陆页面的Controller [Authorize(Roles = "Admin,SuperAdmin")] public class ManageController : ... 
- Spring Boot使用单元测试
			一.Service层单元测试: 代码如下: package com.dudu.service;import com.dudu.domain.LearnResource;import org.junit ... 
