我在哪里以及如何订阅ViewModel中的信使事件?

时间:2013-06-05 14:35:50

标签: windows-phone-8 xamarin mvvmcross

这个问题是后续的"第二次尝试"到我的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时,我可以看到订阅正在向MvxMessenger订阅属性添加另一个条目,导致onShowAdsNavigation()为每个新事件触发两次。

那么,我如何订阅ViewModel中的事件? 或者我可能需要找到一种取消订阅活动的方法吗?

1 个答案:

答案 0 :(得分:1)

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

有关此问题的一些选项,请参阅ViewModel LifeCycle, when does it get disposed?


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

要证明这一点,请尝试https://github.com/slodge/MessengerHacking - 它有一个强制GC发生的按钮。

如果这不适合您的应用,那么请参阅上面的“如果您需要积极......”。