【问题标题】:MvvmCross communication between ViewModelsMvvmViewModels之间的交叉通信
【发布时间】:2015-08-22 21:20:50
【问题描述】:

我是 MvvmCross 和 Xamarin 的新手。我已经研究了一段时间,我试图找到将一些数据从 ViewModel B 发送到 ViewModel A 的最佳方式。这意味着 ViewModel A 负责显示 ViewModel B。关于如何在启动 ViewModel 时将数据发送到它,但是我遇到的没有明确定义的教程展示如何在完成时将数据发送回起始 ViewModel。

我遇到了像 MvvmCross.Messenger 这样的事件聚合器,它似乎是一个理想的候选者。但是,对于 Android 项目,由于 Android Activity 生命周期方法,我不确定这是否是一个不错的选择。

对此的任何帮助将不胜感激。谢谢你。

【问题讨论】:

    标签: xamarin mvvmcross


    【解决方案1】:

    Messenger 是正确的方法,它已在another stack overflow question 中进行了介绍。甚至还有一个示例代码可供您玩弄。

    要点是两个 ViewModel 都接收一个(可能是单例的)Messenger,当 ViewModelB 想让 ViewModelA 需要重新加载其数据时,ViewModelB 通过 Messenger 发送消息。 Messenger 在内部使用 Wea​​kReference 来确保垃圾收集仍然可以继续(检查 this post for more information)

    【讨论】:

    • 非常感谢,我也在看 Stuart Lodge 的视频。 N=12 详细介绍了这个。对于其他正在研究此内容以供参考的人,这是一个很好的资源。 youtube.com/…
    【解决方案2】:

    听起来您想要做的是显示一个虚拟机,以便将特定结果返回给“父”虚拟机。这是通过 StartActivityForResult 嵌入到 Android 中的,但需要一些 hack 才能使用 MvvmCross 实现。

    Greg Shackles 写了一封tutorial 来说明如何实现这一点。进一步讨论here。如果我正确理解您的用例,它比使用 Messenger 更适合 Android 活动流程。

    【讨论】:

    • 我查看了 Greg Shackles 的实现,他自己也承认它部分工作。我写这篇文章的原因是混淆了为什么当 MvvmCross.Messenger 存在时 Greg 需要这样做。这不是一个合适的实现吗?
    • Messenger 是难题的一部分,但它本身并没有为您提供所需的“模态”行为,其中虚拟机打开,收集所需的输入,然后自行关闭并返回结果、错误或取消。它为您提供的只是发送消息的能力,仅此而已。
    • 是的,我调查了这个,当然 Messenger 本身什么也没做。但是,由于提供了一种实现,可以将消息从一个 ViewModel 发送到另一个,我似乎仍然无法理解为什么当 Messenger 可以有效地用于相同目的时,为什么建议使用 Greg 的实现。
    猜你喜欢
    • 2022-10-17
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    相关资源
    最近更新 更多