zoukankan      html  css  js  c++  java
  • 【MVVM Light】Messager的使用

    一、前言

          在MVVM编程的模式中,有时候我们会遇到一个很尴尬的情况:

           若干个xaml.cs都复用一个ViewModel,当ViewModel想传递一个特定的消息给某一个xaml.cs的时候,我们该怎么做?

           或者当一个.cs不方便在另一个.cs文件中new出来使用,但是我确实想传递消息给那个.cs,该怎么办?

           今天就说说MVVM Light中的Messager类,它继承自IMessager接口。

    二、使用方法

          发送页面中:

    Messenger.Default.Send<TMessage>(TMessage message); //第一种方法
    
    Messenger.Default.Send<TMessage>(TMessage message, object token);//第二种方法
    
    Messenger.Default.Send<TMessage, TTarget>(TMessage message);//第三种方法

          一般来说用第一种就足已:(里面的T可以是各种类型)

          我这里this是传的页面本身,可以自己决定传当前页面的特有部分: this.your_property 或者 this.your_method等等

     Messenger.Default.Send<GenericMessage<T>>(new GenericMessage<T>(this, value));

            接收页面中:

    Messenger.Default.Register<GenericMessage<T>>(this, Your_Action);
    
    private void Your_Action(GenericMessage<T> msg)
    {
         // do with msg
    }

           msg会包含发送页面的value,这样我就可以对msg进行相关的处理。

    三、各种情况

          一个发送页面,一个页面接收时: 即第二部分的例子

           一个发送页面,多个页面接收时: 在各自的接收页面中需要对msg进行过滤,获取该接收页面需要的消息。

           多个发送页面,多个页面接收时: 每个发送页面可以设定T,即消息的类型,只要接收页面在Register的时候用对应的类型即可接收到自己想要的Send页面。

    四、总结

          在MVVM中其实还是少用这些Messager类,它会使代码显得不具有可读性,又使程序的代码布局显得不清晰。因为你在一个页面中使用Messager.Default.Send时,其他人看你代码是不方便找到在哪里Register的。它不像我们平时两个页面只要引用一下就可以F12快速的跟踪过去。只有在你实在没办法的时候再去考虑Messager类。

  • 相关阅读:
    python数据类型汇总
    mac下hadoop环境的搭建以及碰到的坑点
    mac搭建hadoop3.1.1伪分布模式 全网最详细教程!
    Mac中安装node.js和npm
    Mac抓包工具Charles的安装激活及使用
    mysql命令行访问远程数据库
    Linux bash总结(一) 基础部分(适合初学者学习和非初学者参考)
    iTerm2 配色方案
    jar包无法引入解决办法
    41 | 怎么最快地复制一张表?
  • 原文地址:https://www.cnblogs.com/lovecsharp094/p/6057138.html
Copyright © 2011-2022 走看看