有人可以帮我解释一下MVVM Light的Messenger吗?我在这里阅读StackOverflow上的一篇文章:MVVM在试图得到这个的视图模型之间传递值.关于MVVM Light的文档在这一点上并不是那么好,所以我完全不确定去哪里.
假设我有两个ViewModel和一个ViewModelLocator.我希望能够在没有问题的情况下在所有三个之间传递参数.我将如何与信使一起做这件事?它有能力做到吗?
编辑:这是我的新实现.截至目前,看起来好像MessengerInstance没有调用令牌.我非常困惑.
在第一个ViewModel中:
MessengerInstance.Send<XDocument>(SelectedDocument);
Run Code Online (Sandbox Code Playgroud)
在第二个:
MessengerInstance.Register<XDocument>(this, xdoc => CopySettings(xdoc));
Run Code Online (Sandbox Code Playgroud)
可能完全错了.没有机会测试它,但当我这样做时,视觉工作室对我不那么生气了.MessengerInstance也会在发送消息之前进行注册.
dev*_*xer 16
假设我有两个ViewModel和一个ViewModelLocator.我希望能够在没有问题的情况下在所有三个之间传递参数.我将如何与信使一起做这件事?它有能力做到吗?
这正是它的用途,是的.
要发送消息:
MessengerInstance.Send(payload, token);
Run Code Online (Sandbox Code Playgroud)
要收到消息:
MessengerInstance.Register<PayloadType>(
this, token, payload => SomeAction(payload));
Run Code Online (Sandbox Code Playgroud)
有许多重载,所以如果不知道你想通过信使完成什么,我将不会涉及所有这些,但上面应该涵盖想要发送和接收带有效负载的消息的简单情况.
请注意,"令牌"可以是识别消息的任何内容.虽然通常使用字符串,但我更喜欢使用枚举,因为它更安全一些,并且能够实现智能感知,"查找用法"等.
例如:
public enum MessengerToken
{
BrushChanged,
WidthChanged,
HeightChanged
}
Run Code Online (Sandbox Code Playgroud)
然后你的发送/接收将是这样的:
// 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;
}
Run Code Online (Sandbox Code Playgroud)
[编辑]以下devuxer评论的URL更改为:http: //blog.galasoft.ch/posts/2009/09/mvvm-light-toolkit-messenger-v2/
| 归档时间: |
|
| 查看次数: |
14482 次 |
| 最近记录: |