美文网首页
WinForm中的mvvm尝试(一)可观察对象

WinForm中的mvvm尝试(一)可观察对象

作者: 双木成林028 | 来源:发表于2022-02-16 18:02 被阅读0次

一、起因

最近在用winform做应用。一直在做安卓开发,winform没怎么用过,也没有系统学习过winform的技术架构。想来自己也没多少精力去系统学习winform的知识,加之现在winform日薄西山,更无心插柳。干脆就尝试用安卓的架构来写一写winfrom吧。安卓中常用的架构是mvvm模式,其中的关键点之一就是可观察对象,于是就开始自己动手写一个吧。

二、可观察对象

在mvvm模式中,ui需要随数据的变化而更新。基于android的MutableLiveData构建一个泛型类,这个类提供两个方法,Observe(Form form, Action<T> action)用来观察数据变化,PostValue(T value)用来推送数据。当调用PostValue时,会触发观察者的action。
    class MutableLiveData<T>
    {
        private Action<T> mAction; //用来存储观察者的动作
        private T mValue; //数据
        public T Value { get; }

        /// <summary>
        /// 和form的生命周期进行绑定,当form关闭时,取消观察者的动作
        /// </summary>
        /// <param name="form"></param>
        /// <param name="action"></param>
        public void Observe(Form form, Action<T> action)
        {
            mAction += action;
            form.FormClosed += (object sender, FormClosedEventArgs e) =>
            {
                mAction -= action;
            };
        }

        /// <summary>
        /// 推送数据并触发事件
        /// </summary>
        /// <param name="value"></param>
        public void PostValue(T value)
        {
            mValue = value;
            mAction?.Invoke(mValue);
        }
    }

三、使用

    public partial class Form1 : Form
    {
        private MutableLiveData<string> content = new MutableLiveData<string>();

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            content.Observe(this, c => { label1.Text = c; });
            content.Observe(this, c => { label2.Text = c; });
            textBox1.TextChanged += TextBox1_TextChanged;
        }

        private void TextBox1_TextChanged(object sender, EventArgs e)
        {
            content.PostValue(textBox1.Text);
        }
    }

四、效果

nua6y-d5vam.gif

相关文章

  • WinForm中的mvvm尝试(一)可观察对象

    一、起因 最近在用winform做应用。一直在做安卓开发,winform没怎么用过,也没有系统学习过winform...

  • winform mvvm模式

    https://www.cnblogs.com/bluedoctor/p/6060278.html

  • RAC运用系列(六)实现MVVM+RAC在TableView中的

    前言 在上一篇中自己尝试了运用RAC+MVVM方式写登录界面RAC运用系列(五) MVVM 实现登录界面在登录注册...

  • 给android开发人员的十个建议

    知道面向对象的六大原则 了解设计模式 了解databinding,尝试MVVM架构 了解单元测试 了解AOP 关注...

  • 对MVVM的理解及其响应式原理

    对于VUE,我们都知道他是一个MVVM式的框架,那么什么是MVVM呢?View层:在Vue中是绑定对象的HTMLV...

  • 响应式编程和管道

    双向绑定 使用双向绑定文本框中的值始终和name值一致 响应式编程 观察者模式与rxjs,观察者注册可观察对象,可...

  • Angular-Observable和RxJS

    参考文章:介绍RxJS在Angular中的应用 一、可观察对象(Observable) 可观察对象支持在应用中的发...

  • MVVM

    MVVM 阅读: 19903 什么是MVVM?MVVM是Model-View-ViewModel的缩写。 要编写可...

  • 作业

    在今天的《易经》课程中,讲到了伏羲的三种观察法(仰视、俯视、广角)。我们也可尝试像伏羲那样观察自然万物,也可以从小...

  • KVO模式

    观察者模式中的一种//用来让一个对象去观察另外一个对象的属性的改变,一旦被观察的对象的属性发生了改变,观察者可以接...

网友评论

      本文标题:WinForm中的mvvm尝试(一)可观察对象

      本文链接:https://www.haomeiwen.com/subject/vfedlrtx.html