C# 实践之 基于winform的mvvm模型,使UI独立,逻辑可测

背景:在winform中可以使用databinding 达到PM模式的开发,但扩展性与可测试性还是不如WPF那样完善,我们使用nuget中第三方库,mvvm fx-winforms,达到数据、业务与UI完全分离开发,并且ui逻辑,业务逻辑完全可测。

  1. 使用nuget下载 mvvm fx winforms库,并引用之。如图:

  3.创建视图数据模型,代码如下:

 public class PersonModel:INotifyPropertyChanged
    {
        private string _id;

        public String ID { get { return _id; } set { _id = value; OnPropertyChange("ID"); } }

        private string _name;
        public String Name { get { return _name; } set { _name = value;
            OnPropertyChange("Name"); } }

        private int _sex;
        public int Sex { get { return _sex; } set { _sex = value; OnPropertyChange("Sex"); } }

        public event PropertyChangedEventHandler PropertyChanged;

        public void OnPropertyChange(String prop)
        {
            if(PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(prop));
            }
        }

    }

  4.创建视图控制器在这里表示为UI逻辑模型,代码如下:

  public class PersonCtrl
    {
        public MyTab mytab;
        public PersonModel cur_model;
        public List<PersonModel> lstModel = new List<PersonModel>();

        public PersonCtrl()
        {

            for (int i = 0; i < 3; i++ )
            {
                lstModel.Add(new PersonModel() { ID = i.ToString(), Name = "test" + i, Sex = i % 2});
            }                

            cur_model = lstModel[0];
        }

        public PersonModel GenCurModel()
        {
            return cur_model;

        }
        public void ShowModel(object param=null)
        {
            Console.WriteLine("id:" + cur_model.ID + " name:" + cur_model.Name + " sex:" + cur_model.Sex);
        }

    }

  注:在这里我们暂时只测试cur_model的数据绑定

  5.创建UI业务逻辑的单元测试,代码如下:

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using MyTabControl;
using MvvmFx.Windows.Data;
using MvvmFx.Windows.Input;
using MvvmFx.Windows;
using MvvmFx.ComponentModel;
using MvvmFx.Windows.Forms;

namespace UnitTes
{

    [TestClass]
    public class UnitTest1
    {
        PersonCtrl ctrl = null;
        BindingManager mgr = null;
        CommandBindingManager cmdMgr = null;

        [TestInitialize]
        public void Setup()
        {
            ctrl = new PersonCtrl();
            mgr = new BindingManager();
            cmdMgr = new CommandBindingManager();
        }

        [TestMethod]
        public void TestMethod1()
        {
            PersonModel model = new PersonModel() { ID = "", Name = "", Sex = -1 };
            Assert.AreEqual(model.ID, "");
            mgr.Bind(model, "ID").To(ctrl.cur_model, "ID").Activate();
            ctrl.cur_model.ID = "13";
            Assert.AreEqual(model.ID, "13");
            model.ID = "1";
            Assert.AreEqual(ctrl.cur_model.ID, "1");
        }

        [TestMethod]
        public void TestCmd()
        {
            String click = "";
            MvvmFx.Windows.Forms.UserControl btn = new MvvmFx.Windows.Forms.UserControl();
            BoundCommand cmd = new BoundCommand((s) =>
            {
                click = "clicked";
            }, (s) => {
                return ctrl.cur_model.ID.Length > 2;
            }, null);

            cmdMgr.CommandBindings.Add(new CommandBinding(cmd, btn, ControlEvent.Click.ToString()));

            Assert.IsFalse(cmd.CanExecute(null));
            ctrl.cur_model.ID = "123";
            Assert.IsTrue(cmd.CanExecute(null));
            cmd.Execute(null);
            Assert.AreEqual(click, "clicked");
        }
    }
}

  注1:TestMethod1用于测试模型的绑定,cur_model表示数据模型,临时的model可以表示任意控件,即绑定的两个值可以互相联动。

  注2:TestCmd用于测试命令的绑定,且包含了按钮是否可用的表达示,其中的 MvvmFx.Windows.Forms.UserControl 模拟button控件

  6.运行单元测试:

  

  7. 这里只使用了其中比较常用的数据与命令的绑定方式,mvvmfx还有其它很多绑定的方式,大家可以下载代码查看sample

时间: 2024-08-04 20:26:39

C# 实践之 基于winform的mvvm模型,使UI独立,逻辑可测的相关文章

基于页面的编程模型

两个实例 这两天写WinForm程序和Android程序. 我发现这两者的开发有很多相似之处. 他们都是基于页面的编程模型. WinForm程序,前端是.desinger.cs文件,后端是.cs文件.他们两个文件实际上是同一个类.这个类继承于Form类. Android程序,前端是.layout的一个xml文件,后端是.cs文件(用的Xamarin.Android).其中的类继承于Activity类. 都是前置代码管界面,后置代码管功能.没有前后端分离. Form和Activity都是页面. 一

中文分词实践(基于R语言)

背景:分析用户在世界杯期间讨论最多的话题. 思路:把用户关于世界杯的帖子拉下来,然后做中文分词+词频统计,最后将统计结果简单做个标签云,效果如下: 后续:中文分词是中文信息处理的基础,分词之后,其实还有特别多有趣的文本挖掘工作可以做,也是个知识发现的过程,以后有机会再学习下. ================================================== * 中文分词常用实现: 单机:R语言+Rwordseg分词包 (建议数据量<1G) 分布式:Hadoop+Smallse

word2vec 中的数学原理详解(四)基于 Hierarchical Softmax 的模型

  word2vec 是 Google 于 2013 年开源推出的一个用于获取 word vector 的工具包,它简单.高效,因此引起了很多人的关注.由于 word2vec 的作者 Tomas Mikolov 在两篇相关的论文 [3,4] 中并没有谈及太多算法细节,因而在一定程度上增加了这个工具包的神秘感.一些按捺不住的人于是选择了通过解剖源代码的方式来一窥究竟,出于好奇,我也成为了他们中的一员.读完代码后,觉得收获颇多,整理成文,给有需要的朋友参考. 相关链接 (一)目录和前言 (二)预备知

编写高质量代码改善C#程序的157个建议——建议87:区分WPF和WinForm的线程模型

建议87:区分WPF和WinForm的线程模型 WPF和WinForm窗体应用程序都有一个要求,那就是UI元素(如Button.TextBox等)必须由创建它的那个线程进行更新.WinForm在这方面的限制并不是很严格,所以像下面这样的代码,在WinForm中大部分情况下还能运行(本建议后面会详细解释为什么会出现这种现象): private void buttonStartAsync_Click(object sender, EventArgs e) { Task t = new Task(()

基于SOA的编程模型

1.webservice是SOA架构的一种实现 ====================================================================================================== Spring-WS编程模型: 面向契约的开发:xml--对象(而不是对象---xml) 编程模型: 1.定义消息契约xml(数据契约+操作契约) 2.生成xsd 3.编写消息端点 4.配置序列化OXM 5.生成wsdl-操作契约 ========

基于Winform、WPF等的客户端文件下载

有时候,我们用C#写一些客户端应用程序需要从服务器下载一些资源,如图片.dll.配置文件等.下面就来说一下,在Winform及WPF中如何下载文件. 我们的资源大多放在自己的网站上,或者从其他网站下载资源,我们需要给客户端一个URL,先给出代码: /// <summary> /// 下载文件 /// </summary> /// <param name="URL">下载文件地址</param> /// <param name=&qu

基于tomcat响应处理模型实现的高并发web服务器

在上一篇博客中,一个简单的AIOweb处理例子,可以看到AIO异步处理,依赖操作系统完成IO操作的Proactor处理模型确实很强大,可以是实现高并发,高响应服务器的不错选择,但是在tomcat中的connector的处理模型还依旧是基于NIO的处理,当然,我认为这可能会在以后的版本进行改进,但另一方面,我更认为AIO的负载控制方面的处理可能是比较难的,因为AIO api并没有提供我们对分配线程组的处理,而只是提供一个线程组,交给操作系统去解决io处理上的问题,所以,这可能会给需要复杂处理的负载

分布式架构下的会话追踪实践【基于Cookie和Redis实现】

分布式架构下的会话追踪实践[基于Cookie和Redis实现] 博客分类: NoSQL/Redis/MongoDB session共享rediscookie分布式架构session 在单台Tomcat应用中,通常使用session保存用户的会话数据.面对高并发的场景,一台Tomcat难当大任,通常我们会使用Nginx在前端拦截用户请求,转发给后端的Tomcat服务器群组.在集群环境下,怎么才能做到session数据在多台Tomcat之间的共享呢? 当然我们可以在多台Tomcat之间进行sessi

word2vec 中的数学原理具体解释(四)基于 Hierarchical Softmax 的模型

  word2vec 是 Google 于 2013 年开源推出的一个用于获取 word vector 的工具包,它简单.高效,因此引起了非常多人的关注.因为 word2vec 的作者 Tomas Mikolov 在两篇相关的论文 [3,4] 中并没有谈及太多算法细节,因而在一定程度上添加了这个工具包的神奇感.一些按捺不住的人于是选择了通过解剖源码的方式来一窥到底,出于好奇,我也成为了他们中的一员.读完代码后.认为收获颇多.整理成文,给有须要的朋友參考. 相关链接 (一)文件夹和前言 (二)预备