目录
1. 问题
如何在子界面中的按钮点击后,将子界面的一些信息传递给主界面中的对象?
类似于这种应该如何处理?
Messenger的消息机制是很简单的处理方式。
2. 介绍
Messenger 是 MVVM Light Toolkit 框架中的一个类库,用于实现 ViewModel 和 View 之间的消息通信。它是一种轻量级、简单易用的消息传递机制,可以有效地解耦 ViewModel 和 View 的依赖关系,从而提高代码的可维护性和可测试性。
使用 Messenger,开发人员可以将 ViewModel 和 View 解耦,并且不必引用或了解彼此的详细信息。ViewModel 可以发送消息,而 View 只需要注册感兴趣的消息,并在接收到消息时采取相应的行动。
3. 使用
/// <summary>
/// 注册订阅事件 (在 View 或 ViewModel 中注册对特定消息的处理方法)
/// </summary>
/// <typeparam name="TMessage">传参类型</typeparam>
/// <param name="recipient">订阅实例</param>
/// <param name="token">发送与接收定义的key值</param>
/// <param name="action">订阅事件触发的action</param>
/// <param name="keepTargetAlive">持续控制实例存在,防止被回收清除</param>
public void Register<TMessage>(object recipient, object token, Action<TMessage> action, bool keepTargetAlive = false);
/// <summary>
/// 注销订阅事件 (取消在 View 或 ViewModel中对特定消息的处理方法的注册)
/// </summary>
/// <typeparam name="TMessage">传参类型</typeparam>
/// <param name="recipient">订阅实例</param>
/// <param name="token">发送与接收定义的key值</param>
void Unregister<TMessage>(object recipient, object token);
/// <summary>
/// 被订阅方触发事件 (在 ViewModel中发送消息,将消息发送给已经注册了该消息的所有接收器)
/// </summary>
/// <typeparam name="TMessage">传参类型</typeparam>
/// <param name="message">参数数据</param>
/// <param name="token">key</param>
public void Send<TMessage>(TMessage message, object token);
三种功能每种都有适用于不同功能的重载,这里只列出一种。
4. 示例
(1)在捕捉方注册
//1. 常规方式,传入执行函数
Messenger.Default.Register<ModelInfo>(this, "ModelInfo", GetMsg);
//2. Lambda方式
Messenger.Default.Register<ModelInfo>(this, "ModelInfo", (info) =>
{
mModelInfo = info;
});
(2) 在发送方触发
Messenger.Default.Send<ModelInfo>(ModelInfo, "ModelInfo");
这样执行Send之后,捕捉方就可以收到该消息,并且获取需要的数据,简单方便。
(3)不需要时在捕捉方注销
Messenger.Default.Unregister<ModelInfo>(this, "ModelInfo");