从导航服务返回时如何保持上一页的页面状态?

How to keep the page state of previous page when going back from Navigation service?

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

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

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

然后问题就来了,当我从ViewC回到ViewB的时候,ViewB还是会调用OnNavigatedTo来获取参数,但是这次因为是从ViewC导航过来的,所以ViewC没有传那个参数的代码视图 B.

然后,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的navigate相同的方法,从ViewC返回时出现问题

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

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

在视图 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;
}