Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows phone 8 我可以在哪里以及如何订阅ViewModel中的messenger事件?_Windows Phone 8_Xamarin_Mvvmcross - Fatal编程技术网

Windows phone 8 我可以在哪里以及如何订阅ViewModel中的messenger事件?

Windows phone 8 我可以在哪里以及如何订阅ViewModel中的messenger事件?,windows-phone-8,xamarin,mvvmcross,Windows Phone 8,Xamarin,Mvvmcross,这个问题是对我的一个问题的“第二次尝试” 我正在使用MvvmCross框架构建一个跨平台的移动应用程序, 我想使用这个插件来接收代码中其他地方发布的事件通知 我已尝试在ctor中添加订阅,如下所示: public class MyViewModel : BaseViewModel, IMyViewModel { private MvxSubscriptionToken _showMsgToken; public MyViewModel () { _sho

这个问题是对我的一个问题的“第二次尝试”

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

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

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

    public MyViewModel ()
    {
        _showMsgToken = MvxMessenger.Subscribe<ShowMsg>(message => onShowNavigation(), MvxReference.Weak);
    }
    private void onShowNavigation()
    {
        //Do Stuff
    }
}
公共类MyViewModel:BaseViewModel、IMyViewModel
{
私有MvxSubscriptionToken_showMsgToken;
公共MyViewModel()
{
_showMsgToken=MvxMessenger.Subscribe(message=>onShowNavigation(),MvxReference.弱);
}
私有void onShowNavigation()
{
//做事
}
}
现在,当我导航到此ViewModel时,一切正常,并收到通知
但是,当我离开并返回此ViewModel时,我可以看到订阅正在向
MvxMessenger
subscriptions属性添加另一个条目,从而导致
onShowAdsNavigation()
为每个新事件触发两次

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

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

有关此选项的一些选项,请参见


我通常不需要主动管理订阅。相反,我依赖于这样一个事实:视图将从UI中删除,因此它及其ViewModel将在以后的某个时间从内存中删除。当这种情况发生时,我知道订阅管理将自动发生——当视图和视图模型被垃圾收集时,订阅也将在不久之后被清理。我知道Messenger中使用的弱引用将意味着订阅将自行清理

为了证明这一点,请尝试-它有一个按钮来强制GC发生


如果这对你的应用程序来说“不够好”,那么请参阅上面的“如果你需要主动…”。

如果你需要主动取消订阅邮件,那么你可以通过捕获视图中的生命周期事件,然后使用这些事件驱动你的viewmodel来实现。这是你的代码-你可以做你喜欢的事情

有关此选项的一些选项,请参见


我通常不关心订阅的主动管理。相反,我依赖于这样一个事实:视图将从UI中删除,因此它和它的ViewModel将在以后的某个时间从内存中删除。当这种情况发生时,我知道订阅管理将自动发生-当视图和ViewModel变得无用时我知道,Messenger中使用的弱引用将意味着订阅将自行清理

为了证明这一点,请尝试-它有一个按钮来强制GC发生

如果这对你的应用程序来说还不够好,那么请参见上面的“如果你需要积极……”