【问题标题】:Send a message to an unconstructed class in Silverlight with MVVM Light使用 MVVM Light 向 Silverlight 中未构造的类发送消息
【发布时间】:2011-03-02 07:42:47
【问题描述】:

大家好, 我正在使用 Silverlight 和 MVVM 模式构建一个项目,我需要做的是,导航到一个页面,其中有一个视图模型作为 LayoutRoot 的 DataContext,我需要将一个对象传递给该视图模型进行编辑,但是因为它尚未构建,我将无法使用 MVVM Light Messenger 类,因为要发送消息,您需要先注册该指定类型。

那么是否可以在构造视图模型类之前发送消息,并且在构造它时我可以获得消息?

【问题讨论】:

  • 我不认为您可以向从未创建的对象发送消息.. 我认为您应该尝试使用一些会话字典并从一个 ViewModel 设置值,然后在您导航到另一个 ViewModel 时读取该值查看。
  • 你是对的,你不能向尚未创建的东西发送消息,所以让我们把问题反过来。我的新实例化对象如何接收以前打算发送给它的消息?一种消息语音邮件,它可以检查创建,如果你愿意的话。有关此类解决方案,请参阅下面的答案。
  • 这正是我要找的,所以我需要检查一下。

标签: silverlight mvvm mvvm-light


【解决方案1】:

我自己没有尝试过,但是this guy 似乎对这个常见问题有一个很好的解决方案。您可以通过在 WP7Contrib.Messaging 文件夹下查看实现它的单个 cs 文件来查看它的源代码(无需下载整个 contrib 项目)here。该项目作为一个整体旨在用于移动应用程序(特别是 WP7),但这个自定义 Messenger 实现确实独立于它。

基本上,他制作了一个特殊的 Messenger 实现,每次有人新注册收听它们时,都会“重新推文”给定类型签名的最后一条消息。这样,第一个 VM 可以发送它的消息,第二个 VM 将被创建(可能由您的 IoC 容器或其他)并注册以侦听并立即获取在它存在之前发送的消息。

当然,这可能会对竞争条件产生一些问题。在预期的收件人有机会收到它之前,它不依赖于为给定签名发送的其他消息。不过,在实践中,我想这不是什么大问题。特别是如果您充分利用消息的目标部分和发送者部分。

【讨论】:

  • 我阅读了该网站,看起来它会起作用,所以我会将其标记为答案,但我必须稍后尝试。
【解决方案2】:

您查看的所有模型都应在设置根视觉对象之前创建。

设置断点

MainViewModel() 先被命中。

Sub3ViewModel() 被命中,监听器注册。

RootVisual 已设置。

【讨论】:

  • 我不知道为什么这被否决了,我一定没有理解这个问题。我想我不清楚在视图导航到之前不允许您在 VM 中注册侦听器的事件顺序。几天前我做了一个类似的演示。 bitbucket.org/dbeattie/navdemo/src
  • 每个视图模型都会在页面导航到时创建。
  • 如果您查看我提到的示例,请在 ViewModelLocator 的构造函数中为 CreateMain() 设置断点。您也可以在 MainViewModel 的构造函数中设置一个。如您所见,在将 MainView 设置为 RootVisual 之前创建了 MainViewModel。 Sub1ViewModel 是在 Sub1View 导航到之前构造的。因此,您可以在视图导航到之前在构造函数中注册一个侦听器。
  • 感谢您的努力,Derek,但我自己想出了另一个解决方案。我所做的是,我在我的 VM1 中注册了一个侦听器,当构建 VM2 时,它会向 VM1 发送一个 NotificationMessage 并等待来自 VM1 的响应,所以这是 VM1 知道 SubViewModel 已构建的时间,因此它将指定的消息发送到虚拟机2。无法提出更好的解决方案,但看起来效果不错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多