使用MVVM Light的Messenger在视图模型之间传递值

有人可以帮我解释一下MVVM Light的Messenger吗? 我在这里阅读StackOverflow上的一篇文章: MVVM在视图模型之间传递值,试图得到它。 关于MVVM Light的文档在这一点上并不是很好,所以我完全不确定去哪里。

假设我有两个ViewModel和一个ViewModelLocator。 我希望能够在没有问题的情况下在所有三个之间传递参数。 我将如何使用信使进行此操作? 它有能力吗?

编辑:这是我的新实现。 截至目前,看起来好像MessengerInstance不会调用令牌。 我非常困惑。

在第一个ViewModel中:

MessengerInstance.Send(SelectedDocument); 

在第二个:

 MessengerInstance.Register(this, xdoc => CopySettings(xdoc)); 

可能完全错了。 没有机会测试它,但当我这样做时,视觉工作室对我不那么生气。 在发送消息之前,MessengerInstance也会进行注册。

假设我有两个ViewModel和一个ViewModelLocator。 我希望能够在没有问题的情况下在所有三个之间传递参数。 我将如何使用信使进行此操作? 它有能力吗?

这正是它的用途,是的。

发送消息:

 MessengerInstance.Send(payload, token); 

要收到消息:

 MessengerInstance.Register( this, token, payload => SomeAction(payload)); 

有许多重载,所以如果不知道你想通过信使完成什么,我将不会涉及所有这些,但上面应该涵盖想要发送和接收带有效载荷的消息的简单情况。

请注意,“令牌”可以是识别消息的任何内容。 虽然经常使用字符串,但我更喜欢使用枚举,因为它更安全一些,并且能够实现智能感知,“查找用法”等。

例如:

 public enum MessengerToken { BrushChanged, WidthChanged, HeightChanged } 

然后你的发送/接收将是这样的:

 // sending view model MessengerInstance.Send(Brushes.Red, MessengerToken.BrushChanged); // receiving view model // put this line in the constructor MessengerInstance.Register(this, token, brush => ChangeColor(brush)); public void ChangeColor(Brush brush) { Brush = brush; } 

[编辑]以下devuxer评论的URL更改为: http : //blog.galasoft.ch/posts/2009/09/mvvm-light-toolkit-messenger-v2/