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

  • 相关阅读:
    简明Secure boot介绍
    密码学有什么用?
    mkimage, no such file or dir
    嵌入式系统安全简介
    希尔排序
    jQuery选择器
    css 选择器
    安装 SQL Server 2008 和管理工具 SQL Server 2008 management studio 及相关问题解决
    mac下安装安卓开发环境
    IOS开发小记-内存管理
  • 原文地址:https://www.cnblogs.com/lovecsharp094/p/6057138.html
Copyright © 2011-2022 走看看