美文网首页
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尝试(一)可观察对象

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