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类。

  • 相关阅读:
    Web性能优化系列(3):如何延迟加载JS
    Web性能优化系列(2):剖析页面绘制时间
    Web性能优化系列(1):Web性能优化分析
    页面制作之开发调试工具(1)
    格式化 SQL 来提高效率
    关于SQL注入,你应该知道的那些事
    jQuery()方法的第二个参数
    JSON简介以及用法代码汇总
    js简单的面试题
    常用meta整理
  • 原文地址:https://www.cnblogs.com/lovecsharp094/p/6057138.html
Copyright © 2011-2022 走看看