有人可以为我解释一下 MVVM Light 的 Messenger 吗?我在这里阅读了一篇关于 StackOverflow 的帖子:MVVM pass values between view models试图得到这个。 MVVM Light 上的文档目前还不是很好,所以我完全不确定该去哪里。
假设我有两个 ViewModel 和一个 ViewModelLocator。我希望能够在所有三个之间毫无问题地传递参数。我将如何与信使一起做这件事?它有这个能力吗?
编辑:这是我的新实现。截至目前,MessengerInstance 似乎不需要 token 。我非常困惑。
在第一个 ViewModel 中:
MessengerInstance.Send<XDocument>(SelectedDocument);
第二个:
MessengerInstance.Register<XDocument>(this, xdoc => CopySettings(xdoc));
可能是完全错误的。还没有机会测试它,但是当我这样做时,visual studio 对我不那么生气了。此外,MessengerInstance 会在消息发送之前进行注册。
最佳答案
Say I have two ViewModels and a ViewModelLocator. I want to be able to pass parameters between all three without issue. How would I go about doing this with the messenger? Is it capable of that?
这正是它的用途,是的。
发送消息:
MessengerInstance.Send(payload, token);
接收消息:
MessengerInstance.Register<PayloadType>(
this, token, payload => SomeAction(payload));
有很多重载,所以在不知道你想通过 Messenger 完成什么的情况下,我不会详细介绍所有重载,但上面的内容应该涵盖了想要发送和接收消息的简单情况有效载荷。
请注意,“ token ”实际上可以是标识消息的任何内容。虽然字符串通常用于此目的,但我更喜欢使用枚举,因为它更安全一些,并且可以启用智能感知、“查找用法”等。
例如:
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;
}
[编辑] 下面 devuxer 评论的 URL 更改为: http://blog.galasoft.ch/posts/2009/09/mvvm-light-toolkit-messenger-v2/
关于c# - 使用 MVVM Light 的 Messenger 在 View 模型之间传递值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18087906/