【问题标题】:Where and how can I subscribe to messenger events inside a ViewModel?我可以在哪里以及如何订阅 ViewModel 中的信使事件?
【发布时间】:2013-06-05 14:35:50
【问题描述】:

这个问题是我的previous question 的后续/“第二次尝试”。

我正在使用 MvvmCross 框架构建一个跨平台的移动应用程序, 我想使用Messenger 插件来接收从我的代码中其他地方发布的事件通知。

我已尝试在ctor 中添加订阅,如下:

public class MyViewModel : BaseViewModel, IMyViewModel
{
    private MvxSubscriptionToken _showMsgToken;

    public MyViewModel ()
    {
        _showMsgToken = MvxMessenger.Subscribe<ShowMsg>(message => onShowNavigation(), MvxReference.Weak);
    }
    private void onShowNavigation()
    {
        //Do Stuff
    }
}

现在,当我导航到此 ViewModel 时,一切正常并收到通知。
但是,当我离开并返回此 ViewModel 时,我可以看到 Subscription 正在向 MvxMessenger 订阅属性添加另一个条目,导致 onShowAdsNavigation() 为每个新事件触发两次。

那么,如何订阅 ViewModel 中的事件? 或者也许我需要找到一种方法来取消订阅事件?

【问题讨论】:

    标签: windows-phone-8 xamarin mvvmcross


    【解决方案1】:

    如果您需要主动取消订阅消息,则可以通过在视图中捕获生命周期事件然后使用这些来驱动视图模型来实现。这是您的代码 - 您可以随心所欲。

    有关这方面的一些选项,请参阅ViewModel LifeCycle, when does it get disposed?


    我通常不关心订阅的主动管理。相反,我依赖于 View 将从 UI 中删除的事实,因此它和它的 ViewModel 将在之后的某个时间从内存中删除。发生这种情况时,我知道订阅管理将自动发生 - 当 View 和 ViewModel 收集垃圾时,订阅也将在不久之后被清理。我知道 Messenger 中使用的弱引用意味着订阅会自行清理。

    为了证明这一点,试试https://github.com/slodge/MessengerHacking - 它有一个按钮可以强制GC发生。

    如果这对您的应用来说“不够好*”,请参阅上面的“如果您需要积极...”。

    【讨论】:

      猜你喜欢
      • 2011-09-04
      • 1970-01-01
      • 2011-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-05
      相关资源
      最近更新 更多