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

2022-02-16  本文已影响0人  双木成林028

一、起因

最近在用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
上一篇 下一篇

猜你喜欢

热点阅读