2017-06-01 198 views
0

我为我的应用程序使用MVVM Light,并且我还实现了用于返回/在页面之间的INavigationService。ViewModel事件多次触发

因此,在一个常见的场景,是这样的

的MainPage>分类>大红大紫>数据页。

在DataPage中,我提出取回结果的请求,并根据回调返回的结果调用.GoBack()方法从堆栈弹出当前页面并返回Rounds。

我注意到的是,如果我先打DataPage和.GoBack()被调用,然后点击不同的回合,回调方法将被触发两次,如果我回来并再次三次,并且像这样继续。

本质上这意味着.GoBack()将被再次调用,并导航导致混乱。我相信这与不清理以前的VM有关,我试图用SimpleIOC的UnRegister/Register类改变这种行为,但没有运气。

+0

听起来你,但挂钩的情况下,当你进入你离开时不脱钩了。我会从回调中的事件中删除回调。 – Slepz

+0

@Slepz我试图做到这一点,现在以另一种方式做了,请检查我提出的答案并告诉我您的评论。 –

回答

0

在ViewModel类

public void UnsubscribeFromCallBack() 
{ 
    this.event -= method; 
} 

在.xaml.cs页面

protected override void OnDisappearing() 
    { 
     base.OnDisappearing(); 
     PageViewModel vm = (this.BindingContext as PageViewModel); 
     vm.UnSubscribeFromCallback(); 
    } 
+0

这应该很好 – Slepz

+0

@Slepz思考mvvm模式,你认为它可以写在一个更有效的方式? –

+0

假设你正在重用这些视图模型和视图,并且不知道更多的上下文,我会说这是最好的方法。或者,您可以在视图模型构造函数中挂钩事件并在析构函数中解除挂钩。然后使用OnAppearing和OnDisappearing设置是否忽略该事件的标志(如果您甚至需要忽略它) – Slepz