zoukankan      html  css  js  c++  java
  • MVVMLightMensenger 学习笔记

    MVVMLight-Mensenger 

    最近一直在使用WPF,配合美工很容易能搭配出效果不错的UI来,开发效率也明显加快

    自己也是最近才开始使用Mvvmlight,通过view和viewmodel分离的模式来进行开发,不但避免了频繁操作各种控件属性事件的麻烦,而且直接操作数据源更加直观。(吐槽:每个界面手工创建VM,有点费劲,界面太多了找vm有点麻烦)

    Mvvmlight中Mensender类是它的一个特色,通过注册发送Messenger能过使不同界面通讯。

    在此之前,我往往是通过事件或者属性传递来做父子窗体的数据传输,大致如下:

    1、事件方法

    //子窗体
    public event Action<int> FlashEventHandler;//声明事件
    //保存命令
    private void SaveEmployeeData()
    {
         FlashEventHandler(1);
    }
    
    //父窗体
    //注册事件,打开窗体
    Con_EmpInfoManger_EmpInfo_Edit con_Emp = new Con_EmpInfoManger_EmpInfo_Edit();
    con_Emp.FlashEventHandler+=new Action(con_Emp_FlashEventHandler);
    con_Emp.ShowDialog();
    //执行刷新
    void con_Emp_FlashEventHandler()
    {
          QueryGrid.ReFresh();
    }
    View Code
    2.传主窗体对象
    //主窗体
    Con_EmpInfoManger_EmpInfo_Edit con_Emp = new Con_EmpInfoManger_EmpInfo_Edit(this);
                con_Emp.FlashEventHandler+=new Action(con_Emp_FlashEventHandler);
                con_Emp.ShowDialog();
    
    //子窗体
    private Con_EmpInfo objFrm = null;
    public Con_EmpInfoManger_EmpInfo_Edit(Con_EmpInfo frm)
    {
         objFrm =frm;
    }
    private void SaveEmployeeData()
    {
        objFrm .回调公共方法();
    }
    View Code

    当然实现这种简单需求的方法很多,这里我要介绍的是MVVMLight中Messenger方法

    Messenger方法主要提供了Register<TMessage>,UnRegister<TMessage>,Send<TMessage>三个方法来实现消息的注册,注销和发送.并且支持任意类型的数据传输.那简单的实现就如下:

    //父窗体
    Messenger.Default.Register<string>(this, "token", e =>
    {
            MessageBox(e);//显示接收到的信息
    }
    
    //子窗体
    //发送命令
     Messenger.Default.Send<string>("0", "token");
    View Code

    你看很简单得发送接收,跟是哪个界面调用的完全没有关系,相当于说耦合性相当低.那它是怎么实现的呢?

    实际上MvvmLight中加入了Messenger这么一个静态的对象,与其说是静态它其实是一个单例,系统中各个界面获得这个对象来操作它维系的一个事件列表.

    这个事件列表Dictionary<Type, List<ActionAndToken>> 很明显包含了Type以及一个事件和标记的列表.通过Register(增加),UnRegister(删除)和Send(调用)来实现消息功能,并且它不是一个强引用,所以再增减一个对象不会导致内存泄露.其中的原理也很简单,交叉比对列表来调用Action.具体内容大家可以看下源码.

    值得注意的一点,要防止消息的重复注册以及何时应该注销注册.这个在实际操作当中可能会遇到,但是很容易能够解决.

    我的第一篇技术博,大家轻拍,本人初学乍练有问题请大侠们指出,谢谢!!!

  • 相关阅读:
    STM8s窗口看门狗
    开篇
    习题6-8 统计一行文本的单词个数
    习题9-4 查找书籍
    习题9-3 平面向量加法
    习题9-1 时间换算
    习题7-8 字符串转换成十进制整数
    习题8-10 输出学生成绩
    习题7-7 字符串替换
    习题7-6 统计大写辅音字母
  • 原文地址:https://www.cnblogs.com/qyzBlog/p/3450781.html
Copyright © 2011-2022 走看看