【问题标题】:How to keep the page state of previous page when going back from Navigation service?从导航服务返回时如何保持上一页的页面状态?
【发布时间】:2020-01-17 23:46:18
【问题描述】:

我对 Xamarin.Forms 上的 Prism Navigation 有疑问。

假设我有 3 页,导航堆栈看起来像 Navigation/ViewA/ViewB/ViewC。当从 ViewA 导航到 ViewB 时,我有一个 List 作为参数传递,所以基本上在 ViewB 中我将使用OnNavigatedTo 方法来获取参数并将数据设置为一些可绑定的属性。

然后,从 ViewB 到 ViewC,我也需要传递相同的参数,所以这个参数有点像 3 个视图。

然后问题发生了,当我从 ViewC 回到 ViewB 时,ViewB 仍然会调用 OnNavigatedTo 来获取参数,但这一次,由于它是从 ViewC 导航的,所以 ViewC 没有将参数传递给 ViewB 的代码。

那么,ViewB获取不到参数,那么如果到那个时候再去ViewC,ViewC就没有需要绑定到可绑定属性的数据了。

所以,我的问题是:我是否必须再次将相同的参数从 ViewC 传递给 ViewB?如果是这样的解决方案,那么这样做会不会有点愚蠢?有什么解决方案可以保持上一页的状态,当我们从 ViewC 返回时,一切都在那里?

感谢并期待解决方案或对此的任何见解。

我只是重现了这个问题,我知道我可以再次传回参数,但这绝对不是这个问题的理想解决方案。

让我们看看。在视图A中:

private async void Navigate()
{
    var parameter = new NavigationParameter();
    parameter.Add("SomeData", list);
    await _navigationService.NavigateAsync("ViewB", parameter);
}

在视图 B 中:

public void OnNavigatedTo(NavigationParameter paramters)
{
    // This code will be null when going back from ViewC
    var list = parameters["SomeData"] as List<string>();
    this.SomeBindableData = list;
}

ViewB使用了和ViewA的navigation一样的方法,从ViewC返回时出现问题。

我想要这个问题的理想解决方案。请 Prism 团队的某个人帮忙检查一下,我相信这是需要处理的事情。

【问题讨论】:

  • Prism 提供 NavigationMode ,您可以使用它来检测是否是对视图模型的新调用/回调用......在 OnNavigatedTo 方法中类似这样的事情 if (parameters.GetNavigationMode() == Prism.Navigation .NavigationMode.New) { //参数初始化 }
  • 感谢 cmets Hamid,是的,我将在我的项目中使用它。实际上我知道这一点,但我只是被困在如何保持状态上。它在导航堆栈中,所以它仍然存在。这次真是太傻了。 :)

标签: xamarin.forms prism


【解决方案1】:

当视图在堆栈中时,它不会被释放或任何东西,所以它的状态将被保留。在这里你只需要知道你的 View 是否被初始化:

在视图 B 中:

private bool _isInitialized;

public void OnNavigatedTo(NavigationParameter paramters)
{
    if (_isInitialized)
        return;

    // This code will be null when going back from ViewC
    var list = parameters["SomeData"] as List<string>();
    this.SomeBindableData = list;
    _isInitialized = true;
}

【讨论】:

  • 我会接受你的回答,但实际上我原始帖子的评论实际上也有很大帮助。我相信更好的方法是结合你们提到的,没有必要使用_isInitialized,我们可以使用parameters.GetNavigateionMode,如果那个模式不是返回,那么就返回。我实施了您的解决方案并且它确实有效,因此非常感谢您迄今为止的帮助。只是你的另一个想法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-03
  • 2015-10-30
  • 2014-09-14
  • 1970-01-01
  • 1970-01-01
  • 2022-08-22
相关资源
最近更新 更多