c# 模仿 vue 实现 winform 的数据模型双向绑定

前前前段时间面试遭拒,当时面试关问自己的一些东西确实不懂,其中就包括vue(其实有看过相关文章和文档,秉着 如果只是用轮子的话,需要时间和文档就够了,事实上只是使用的话,按规范来就行了)。

但是自己怎么能轻易停留在用呢,于是在花了点时间,直接搜索vue绑定原理,详细看了两篇文章 

http://m.jb51.net/article/107927.htm

http://www.cnblogs.com/likeFlyingFish/p/6744212.html 

其实就是观察者的设计模式,关键在于事件的监听。而 js 有个 defineProperty 修改属相的get set 方法,使其在 set 数据的时候判断是否有变化后进行通知,也就是执行一边对该属性订阅的方法。
再将我们平时对dom操作的方法进行封装注册到某个属性的订阅列表,即可实现数据视图绑定。其实不管怎么做,最终也还是要操作dom的,只是人家封装好了的而已。

而后面突然有个想法,我能不能模仿 vue 做个winform 的双向绑定呢?
尽管窗口开发 双向绑定已经有成熟的 wpf 了, 而 winform 也有 DataBindings 绑定数据(这个在后面自己的测试中发现没能在变化中通知,应该还要进一步的封装),但是就想把 vue的方法用c#实现一下。

按照 js 那一套,要有个 Observe 来重写对象属性的 get;set;,还要有个 Dep 来保存订阅者,还要有个 Watcher 来监听属性。

但是 c# 没法代码批量改 getter setter 这两个方法(试过反射不出这两个方法),那只需要实现 Dep 和 Watcher 。

Watcher

对象的属性通过Watcher 来监听,不同控件绑定同一个 属性的话,就是不同的Watcher 。为统一通知(观察者调用),我们声明一个接口:

namespace Mvvm
{
    /// <summary>
    /// 统一监听接口 
    /// </summary>
    public interface IWatcher
    {
        void Update();
    }
}

然后实现这个接口(详细看注释)

namespace Mvvm
{
    /// <summary>
    /// 监听者
    /// </summary>
    public class Watcher : IWatcher
    {
        /// <summary>
        /// 实体类型
        /// </summary>
        private Type type = null;
        /// <summary>
        /// 属性变化触发的委托
        /// &
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值