MvvmLight信使需要三个部分:

1、自定义信件类,普通的Model,供在发布者和订阅者之间传递信息用。

2、发布,通常是在某一事件函数中进行发布,Messenger.Default.Send

3、订阅,Messenger.Default.Register

命名空间:GalaSoft.MvvmLight.Messaging

用途:ViewModel之间通信、ViewModel和View之间通信

下面是ViewModel之间通信的例子:使用TextBox控制MainWindow的标题,如图

1、首先,新建信件类,起名TitleTextChangedMessenger(发布者为主动方,所以信件类名称以发布者为主)。

public class TitleTextChangedMessenger
{
    public string NewText { get; set; }    // 用做返回值
    public string Result { get; set; }
}

2、新建MainViewModel类,TitleTextBoxViewModel类。

(如果选择在NuGet内完全安装MVVM Light,则会默认创建MainViewModel类)

public class MainViewModel : ViewModelBase
{
    public MainViewModel()
    {        // 订阅
        Messenger.Default.Register<TitleTextChangedMessenger>(this, (messenger) =>
        {
            Title = messenger.NewText;
            messenger.Result = "Success";
        });
    }

    string _title;
    public string Title
    {
        get { return _title; }
        set
        {
            if (_title != value)
            {
                _title = value;
                RaisePropertyChanged("Title");
            }
        }
    }
}
public class TitleTextBoxViewModel : ViewModelBase
{
    string _text;
    public string Text
    {
        get { return _text; }
        set
        {
            if (_text != value)
            {
                _text = value;
                RaisePropertyChanged("Text");

                TitleTextChangedMessenger messenger = new TitleTextChangedMessenger { NewText = _text };                // 发布
                Messenger.Default.Send<TitleTextChangedMessenger>(messenger);
                                // 这里是为了验证发布&订阅方法的同步,由此可以知道信使可以返回结果,相当于函数调用的返回值
                string result = messenger.Result;
            }
        }
    }
}

3、前台代码。(其中DataContext的绑定使用Locator,由MVVM Light的ViewModelLocator定位)

<Window x:Class="MVVMLightTutorial.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="350" Width="525"
        DataContext="{Binding Source={StaticResource Locator}, Path=Main}"
        Title="{Binding Title}">
    <Grid>
        <TextBox DataContext="{Binding Source={StaticResource Locator}, Path=TitleTextBox}"
                 Text="{Binding Text, UpdateSourceTrigger=PropertyChanged}"></TextBox>
    </Grid>
</Window>

工程代码:MvvmLightMessengerTutorial.zip

初学WPF,文章仅为参考用,如果有错误,恳请指出!

MvvmLight Messenger(信使)的更多相关文章

  1. Messenger信使

    * Messenger用于Activity和Service之间消息传递 需求:activity来绑定服务,绑定成功后,将数据发送给service,service收到消息后,再发送信息给activity ...

  2. MVVMLight - Messenger 2

    本篇介绍MvvmLight中一个重要的东东,那就是Messenger. (一)Messenger的基本组成 Messenger类用于应用程序的通信,接受者只能接受注册的消息类型,另外目标类型可以被指定 ...

  3. MVVMLight - Messenger 1

    Messenger Mvvm提倡View和ViewModel的分离,View只负责数据的显示,业务逻辑都尽可能放到ViewModel中, 保持View.xaml.cs中的简洁(没有任何代码,除了构造函 ...

  4. MvvmLight框架使用入门(一)

    MvvmLight是比较流行的MVVM框架,相对较为简单易用.可能正因为简单,对应的帮助文档不多,对初学者就不够友好了.这里会用几篇随笔,就个人对MvvmLight的使用经验,来做一个入门的介绍. 第 ...

  5. MvvmLight框架使用入门(四)

    本篇我们着重介绍ViewModelBase,演示Set和RaisePropertyChanged方法的使用,以及就Cleanup方法释放资源展开讨论. ICleanup 接口.实现该接口的ViewMo ...

  6. Android 进阶10:进程通信之 Messenger 使用与解析

    读完本文你将了解: Messenger 简介 Messenger 的使用 服务端 客户端 运行效果 使用小结 总结 代码地址 Thanks 前面我们介绍了 AIDL 的使用与原理,这篇文章来介绍下 A ...

  7. 好玩的Handler

    Android提供了Handler和Looper来满足线程间的通信; Handler和Activity的任务栈不同,它是先进先出原则; Handler:你可以构造Handler对象来与Looper沟通 ...

  8. Android总结篇系列:Android Service

    Service通常总是称之为“后台服务”,其中“后台”一词是相对于前台而言的,具体是指其本身的运行并不依赖于用户可视的UI界面,因此,从实际业务需求上来理解,Service的适用场景应该具备以下条件: ...

  9. Android应用框架浅析

    http://blog.csdn.net/yanbober/article/category/3206943 Android应用层View绘制流程与源码分析   http://blog.csdn.ne ...

随机推荐

  1. 微信网页签名失败(invalid signature)

    签名失败,建议按以下步骤排查 确认签名算法正确,可用 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign 页面工具进行校验. 确认con ...

  2. JS中window.document对象

    小知识点注:外面双引号,里面的双引号改为单引号:                  在div里面行高设置和整个外面高度一样,才能用竖直居中,居中是行居中                  文本框取出来 ...

  3. 类似jquery的一个demo

    通过以下的demo,可以大体知道jquery的一些组织结构以及一些实现方法. 实际上jquery就是一个全局变量,只是在这个变量上添加了各种属性和方法. 首先我们要理解什么是匿名函数自执行,简单点就是 ...

  4. ThinkPHP第七天(F函数使用,项目分组配置,项目分组模板文件放置规则配置)

    1.F(文件名称,写入数据,写入地址),用于将数据写入至磁盘文件中,如F('Data',$arr,'./Data/'),作用是将$arr写入至网站根目录的Data文件夹中的Data.php中. 2.读 ...

  5. Python之路:迭代器和yield生成器

    一.迭代器 对于Python 列表的 for 循环,他的内部原理:查看下一个元素是否存在,如果存在,则取出,如果不存在,则报异常 StopIteration.(python内部对异常已处理) 使用迭代 ...

  6. 面向对象程序设计-C++ Finial exam review NOTES【第十六次上课笔记】

    写在前面: 我记得也不全,如果有记录的更全的同学可以留言,我会添加哒 :) 常量 内敛函数 为什么需要内敛函数 内敛函数适用于什么场合 内敛函数本身,最大优点是,避免了真正函数调用的开销 因为普通函数 ...

  7. C中的宏

    1. 简单宏定义 简单的宏定义有如下格式: [#define指令(简单的宏)] #define  标识符替换列表 替换列表是一系列的C语言记号,包括标识符.关键字.数.字符常量.字符串字面量.运算符和 ...

  8. 转: seajs手册与文档之 -- require规则

    require 规则 正确拼写 不要修改 使用直接量 动态依赖的小提示 书写规则 使用 SeaJS 书写模块代码时,需要遵循一些简单规则: 1. 正确拼写 在模块代码中,第一个参数 必须 命名为 re ...

  9. 第五节 Code 128 码

    128码开始於1981年推出,是一种长度可变.连续性的字母数字条码.与其他一维条码比较起来,128码是较为复杂的条码系统,而其所能支援的字元也相对地比其他一维条码来得多,又有不同的编码方式可供交互运用 ...

  10. exp-00091 oracle错误的解决办法

    在进行数据库导入导出使用命令exp.imp经常出现exp-00091 这样的错误的时候,我们需要做的是对于环境变量NLS_LANG设置正确 首先,我们先查看需要导出的数据库的字符编码    selec ...