【问题标题】:ViewModel event fires multiple timesViewModel 事件多次触发
【发布时间】:2017-06-01 16:25:43
【问题描述】:

我正在为我的应用程序使用 MVVM Light,并且我还实现了 INavigationService 以在页面之间返回/返回。

所以在一个常见的场景中,它是这样的

MainPage > Categories > Rounds > DataPage.

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

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

本质上,这意味着 .GoBack() 将被再次调用并且导航会变得混乱。

我相信这与没有清理以前的虚拟机有关,我尝试使用 SimpleIOC 中的 UnRegister / Register 类更改此行为,但没有运气。

【问题讨论】:

  • 听起来你在进入时连接了事件,但在离开时没有取消它。我会从回调中的事件中删除回调。
  • @Slepz 我正在尝试这样做,现在以另一种方式进行,请检查我提出的答案并告诉我您的评论。

标签: xamarin.forms mvvm-light


【解决方案1】:

在 ViewModel 类中

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

在 .xaml.cs 页面中

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

【讨论】:

  • @Slepz 想到 mvvm 模式,你觉得可以写成更高效的方式吗?
  • 假设您正在重用这些视图模型和视图,并且不了解更多上下文,我会说这是最好的方法。或者,您可以在 viewmodel 构造函数中挂接事件并在析构函数中取消挂接。然后使用 OnAppearing 和 OnDisappearing 设置是否忽略事件的标志(如果您甚至需要忽略它)
猜你喜欢
  • 2016-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多