使用MVVM Light';s在视图模型之间传递值的Messenger
本文关键字:之间 模型 Messenger 视图 Light MVVM 使用 | 更新日期: 2023-09-27 18:26:36
有人能为我解释一下MVVM Light的信使吗?我在这里读了一篇关于StackOverflow的文章:MVVM在视图模型之间传递值,试图获得这个值。MVVM Light上的文档目前还不太好,所以我完全不确定该去哪里。
假设我有两个ViewModels和一个ViewModelLocator。我希望能够在这三者之间无问题地传递参数。我该如何和信使一起做这件事?它能做到吗?
编辑:这是我的新实现。到目前为止,MessengerInstance似乎没有调用令牌。我非常困惑。
在第一个ViewModel中:
MessengerInstance.Send<XDocument>(SelectedDocument);
第二个:
MessengerInstance.Register<XDocument>(this, xdoc => CopySettings(xdoc));
可能是完全错误的。我还没有机会测试它,但当我这样做的时候,视觉工作室对我没有那么生气。此外,MessengerInstance会在发送消息之前进行注册。
假设我有两个ViewModels和一个ViewModelLocator。我希望能够在这三者之间无问题地传递参数。我该如何和信使一起做这件事?它能做到吗?
这正是它的用途,是的。
发送消息:
MessengerInstance.Send(payload, token);
接收消息:
MessengerInstance.Register<PayloadType>(
this, token, payload => SomeAction(payload));
有很多过载,所以在不知道你试图通过信使完成什么的情况下,我不会详细介绍所有这些,但以上应该涵盖了想要发送和接收带有有效负载的消息的简单情况。
请注意,"token"实际上可以是标识消息的任何东西。虽然字符串经常用于此,但我更喜欢使用枚举,因为它更安全,并且可以实现intellisense、"查找用法"等。
例如:
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<Brush>(this, token, brush => ChangeColor(brush));
public void ChangeColor(Brush brush)
{
Brush = brush;
}
[EDIT]下面devuxer评论的URL更改为:http://blog.galasoft.ch/posts/2009/09/mvvm-light-toolkit-messenger-v2/