【问题标题】:MVVM Light Messages - Multiple ViewModel instancesMVVM Light Messages - 多个 ViewModel 实例
【发布时间】:2013-07-04 13:32:43
【问题描述】:

我确定以前有人问过这个问题,但我无法得到正确的答案。

这里是场景:

我有一个网格,每行有两个图表。单击 Graph1 上的某些内容,使用来自 Graph1 的代码后发送一条消息:

Messenger.Default.Send<MyCustomMessageType>(message);

然后,在我的 ViewModel for Graph 2 上,我在构造函数中注册:

Messenger.Default.Register<MyCustomMessageType>(this, (message) => UpdateDataContext(message));

问题在于 Send,现在将其发送到该类型的 ViewModel 的所有实例(这确实有意义)。

如何阻止这种情况发生?

【问题讨论】:

  • 你可以使用token作为你消息的key。
  • 您好。我已经阅读了有关令牌的信息.. 但是如何使用它们?我如何在接收视图模型中知道要使用哪个令牌?我的 ViewModel 没有立即构建

标签: c# .net mvvm mvvm-light


【解决方案1】:

发送令牌以指定接收者

void Register<TMessage>(object recipient, object token, Action<TMessage> action);
void Send<TMessage>(TMessage message, object token);

例子:

MessengerInstance.Register<Foo>(this, "thespecialone", theFoo=> FunctionFoo(theFoo));
MessengerInstance.Send<Foo>(message, "thespecialone");

【讨论】:

  • 感谢您的回答。如上所述.. 在我接收 ViewModel 中,我将如何获得在消息和模型之间共享的唯一密钥
  • 您需要使用密钥注册并再次使用密钥发送。
  • 好的,我明白你在说什么……让我试试
【解决方案2】:

感谢大家的回答。该消息不是我的问题。问题是我不应该使用 ViewModelLocator 。因为每一行都需要自己的 ViewModel,所以我不再使用 ViewModelLocator,而是在控件的 Onload 中实例化 ViewModel 并将其设置为 Datacontext。不过感谢您的建议。

【讨论】:

    【解决方案3】:

    首先,您可以在构造函数之外为消息注册视图模型,最好是在 ioc 中。其次,不要使用默认(单例),根据特定视图模型组的需要管理 Messanger 实例。 PS 这种方法的最大好处之一(除了明显有用的粒度和解耦)是对代理的支持。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-10
      • 1970-01-01
      • 2013-08-07
      • 2013-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多