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

时间:2019-09-17 06:44:32

标签: xamarin.forms prism

我有一个有关Xamarin.Forms的Prism Navigation的问题。

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

然后,从ViewB到ViewC,我还需要传递相同的参数,因此该参数有点像通过3个视图。

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

然后,ViewB无法获取该参数,那么如果到那时再次进入ViewC,ViewC将不再具有绑定到可绑定属性所需的数据。

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

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

我只重现该问题,并且知道可以再次传递该参数,但这绝对不是解决此问题的理想解决方案。

让我们看看。在ViewA中:

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导航相同的方法,并且从ViewC返回时出现了问题。

我想为这个问题找到理想的解决方案。并请Prism小组的一些人员帮助检查此问题,我相信这是需要处理的事情。

1 个答案:

答案 0 :(得分:0)

尽管视图在堆栈中,但不会被丢弃或任何其他方式,因此将保留其状态。在这里,您只需要知道您的View是否已初始化:

在ViewB中:

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;
}