使用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/