一、起因
最近在用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
网友评论