首页 > 其他分享 >MVVM模式开发WinForm-ReactiveUI

MVVM模式开发WinForm-ReactiveUI

时间:2024-06-17 20:10:55浏览次数:16  
标签:ViewModel MVVM 绑定 vm ReactiveUI WinForm

一、引言

  谈到MVVM设计模式,首先让人想到的是WPF。没错,MVVM的概念是微软在2005年提出的,并首次将其应用到WPF中。最近非常火的Vue.js也是使用了MVVM的设计模式。MVVM设计模式的核心部分是DataBinding机制。
顾名思义,其功能就是将Model的数据绑定到View层,并且将View层控件的变换绑定到Model的双向绑定
MVVM的优点是业务逻辑层不用关注View,只专注对Model的处理,开发效率提升很大。

二、背景

  最近公司在开发一套管理系统的桌面客户端程序,由于各种原因,最终选型使用WinForm进行开发。由于好几年没有再接触过WinForm了,起初一段时间非常的不适应,开发效率极低,不仅要考虑不同分辨率的适应情况(这里稍微吐槽一下:WinForm本身就难以处理不同分辨率的自适应),同时还要处理数据的显示及提交。 
  既然要提升开发效率,我们先从设计模式下手。今天要为大家带来的是ReactiveUI。 
  ReactiveUI是实现了MVVM模式的框架,它的核心目标是可以在ViewModel中相关属性发生变化时可以可执行相应的命令。ReactiveUI支持Xamarin、WPF、WinForm、Windows Phone、UWP。这里我们选择WinForm对应的版本ReactiveUI.WinForms。

三、示例

  下面为大家带来ReactiveUI.WinForms的一个简单的示例,来一起认识ReactiveUI.WinForms。

1、创建WinForm项目

打开vs,我们创建一个WinForm的项目: 
创建项目

2、安装ReactiveUI.WinForms

项目创建完成后,鼠标右键单击当前项目,选择“管理NuGet程序包”,在打开的窗口中选择“浏览”,并搜索ReactiveUI.WinForms进行安装 
NuGet

3、创建ViewModel

在项目目录下新建文件夹ViewModel,并在文件夹下新建一个PersonViewModel类,写入如下代码:

using ReactiveUI;

namespace WinformMvvm.ViewModel
{
    //ViewModel需要继承自ReactiveObject
    public class PersonViewModel : ReactiveObject
    {
        private int _id;
        private string _name;
        private int _age;

        public PersonViewModel()
        {
            Id = 1;
            Name = "张三";
            Age = 18;
        }

        public int Id
        {
            get => _id;
            set => this.RaiseAndSetIfChanged(ref _id, value);
        }

        public string Name
        {
            get => _name;
            set => this.RaiseAndSetIfChanged(ref _name, value);
        }

        public int Age
        {
            get => _age;
            set => this.RaiseAndSetIfChanged(ref _age, value);
        }
    }
}
  • 注意:ViewModel类需要继承自ReactiveObject

4、给窗体拖入相应的控件并修改相关代码

在项目默认的Form1窗体上拖入3个textbox和3个label控件 
右键单击Form1窗体,选择“查看代码”,进入代码窗口,写入如下代码:

using ReactiveUI;
using System.Windows.Forms;
using WinformMvvm.ViewModel;

namespace WinformMvvm
{
    //视图窗体需要实现IViewFor接口,并以需要绑定的ViewModel类(本例中的ViewModel是PersonViewModel)作为泛型传入接口
    public partial class Form1 : Form, IViewFor<PersonViewModel>
    {
        public Form1()
        {
            InitializeComponent();
            this.WhenActivated(a =>
            {
                a(this.Bind(ViewModel, vm => vm.Id, v => v.textBox1.Text));
                a(this.Bind(ViewModel, vm => vm.Name, v => v.textBox2.Text));
                a(this.Bind(ViewModel, vm => vm.Age, v => v.textBox3.Text));
                a(this.OneWayBind(ViewModel, vm => vm.Id, v => v.label1.Text));
                a(this.OneWayBind(ViewModel, vm => vm.Name, v => v.label2.Text));
                a(this.OneWayBind(ViewModel, vm => vm.Age, v => v.label3.Text));
            });
            ViewModel = new PersonViewModel();
        }

        object IViewFor.ViewModel
        {
            get => ViewModel;
            set => ViewModel = (PersonViewModel)value;
        }

        public PersonViewModel ViewModel { get; set; }
    }
}
  • 注意:视图窗体需要实现IViewFor接口,并以需要绑定的ViewModel类(本例中的ViewModel是PersonViewModel)作为泛型传入接口
  • Form1构造函数中WhenActivated里的代码即为绑定相关。this.Bind表示双向绑定,this.OneWayBind表示单向绑定。3个textBox分别双向绑定ViewModel对应的属性字段用作显示及输入更新,3个label分别单向绑定ViewModel对应的属性字段用做显示。

    下图即为整个示例项目的结构: 
    项目结构

5、运行项目

至此,项目的编码已经完成,我们来运行当前项目,查看效果。 
运行 
可以看到,由于ReactiveUI中MVVM的实现,我们在修改textBox中的内容时,ViewModel中相应的属性也会跟着改变,并将改变反应在textBox和label中。

四、总结

以上便是运用ReactiveUI框架使用MVVM模式开发WinForm的一个简单示例。希望本文能为想要在WinForm下使用MVVM模式进行开发的童鞋们提供帮助。

标签:ViewModel,MVVM,绑定,vm,ReactiveUI,WinForm
From: https://www.cnblogs.com/soliang/p/18253132

相关文章

  • WinForm中使用MaskedTextBox制作IP地址输入框
    1.实现的功能:输入IP地址,形如000.000.000.000的格式,并设置keydown事件,当输入点(.)的时候,自动跳至下一栏。具体方法:(1).从工具箱中拖入一个MaskedTextBox,命名为MaskedTextBox_IP。(2).在Mask属性中,输入:000.000.000.000。(3).在PromptChar属性中,将_换为空格,如果你喜欢_的话,也......
  • C# Winform 设置焦点控件的两种方式和注意事项
    一、方法//设置本窗体的活动控件为某个控件this.ActiveControl=this.button2;//调用Focus方法设置某个控件获取焦点this.button2.Focus();二、注意事项1、在窗体实例化——加载——绘制——显示完毕四个过程中使用两种方法设置效果有区别,具体如下:namespaceWindowsFormsAppl......
  • WinForm窗口水印
    先上效果图 参考代码分享:给窗体添加水印-陈恩点-博客园(cnblogs.com)WinForm添加水印-白衣如花-博客园思路使用透明无框窗体覆盖需要添加水印的窗体,并设置owner为主窗体。然后在透明窗体绘制水印文本即可。代码1publicclassWatermark2{3pr......
  • 界面控件DevExpress WinForms垂直&属性网格组件 - 拥有更灵活的UI选择(一)
    DevExpressWinForms垂直&属性网格组件旨在提供UI灵活性,它允许用户显示数据集中的单个行或在其90度倒置网格容器中显示多行数据集。另外,用户可以把它用作一个属性网格,就像在VisualStudioIDE中那样。P.S:DevExpressWinForms拥有180+组件和UI库,能为WindowsForms平台创建具有......
  • C# winform中RDLC报表绘制
    C#winform中RDLC报表绘制使用集成开发环境为VS2010,框架版本为.NETFramework4以下我们以一个简单的学生报表作为例子。publicclassStudent{publicstringname{get;set;}publicstringid{get;set;}publicstringclasses{get;set;}publicstringhome{get;set;}publi......
  • 界面控件DevExpress WinForms垂直&属性网格组件 - 拥有更灵活的UI选择(一)
    DevExpressWinForms垂直&属性网格组件旨在提供UI灵活性,它允许用户显示数据集中的单个行或在其90度倒置网格容器中显示多行数据集。另外,用户可以把它用作一个属性网格,就像在VisualStudioIDE中那样。P.S:DevExpressWinForms拥有180+组件和UI库,能为WindowsForms平台创建具有影响......
  • C# WinForm 实现学生成绩信息管理系统,连接SQL数据库,完整代码
    C#WinForm实现学生成绩信息管理系统《面向对象程序设计》实验功能介绍1、学生信息查询2、学生选课信息3、学生信息修改4、学生成绩录入实验分析遇到的问题解决方法主要问题嗨,我是射手座的程序媛,期待与大家更多的交流与学习,欢迎添加:3512724768《面向对象程序设计......
  • 【转】【C#】电脑设置150%,Winform界面显示错乱
    在电脑设置150%的时候,winform下窗体布局会产生变化,如下图所示 解决方案1、打开注册表编辑器,找到下面这个路径:HKEY_CURRENT_USER\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\AppCompatFlags\Layers如下图:2、在右侧新建一个字符串值。2.1值为:devenv.exe所在的路径(安装vs时......
  • 界面控件DevExpress WinForms的流程图组件 - 可完美复制Visio功能(二)
    DevExpressWinForms的Diagram(流程图)组件允许您复制MicrosoftVisio中的许多功能,并能在下一个WindowsForms项目中引入信息丰富的图表、流程图和组织图。P.S:DevExpressWinForms拥有180+组件和UI库,能为WindowsForms平台创建具有影响力的业务解决方案。DevExpressWinForms能......
  • 一款WPF的精简版MVVM框架——stylet框架(MVVM绑定、依赖注入等)
    今天偶然知道一款叫做stylet的MVVM框架,挺小巧的,特别是它的命令触发方式,简单粗暴,让人感觉很巴适,现在我做一个简单的demo来顺便来分享给大家。本地创建一个WPF项目,此处我使用.NET8来创建。然后引用stylet最新的nuget包。 然后删掉App.xaml里面自带的启动项删掉以后: sty......