Prism 7 UWP导航后退参数丢失

时间:2019-03-07 09:39:04

标签: uwp prism prism-7

给出具有三个视图和相应ViewModel的Prism 7 UWP应用程序:

containerRegistry.RegisterForNavigation<BlankPage1, BlankPage1ViewModel>();
containerRegistry.RegisterForNavigation<BlankPage2, BlankPage2ViewModel>();
containerRegistry.RegisterForNavigation<BlankPage3, BlankPage3ViewModel>();

如果我们从BlankPage1导航到BlankPage2,并传递一个参数(从ViewModel1的Command中):

public virtual DelegateCommand GoToPage2Command => new DelegateCommand(GoToPage2);
public virtual async void GoToPage2() {
     await NavigationService.NavigateAsync("BlankPage2", null, ("param", 5678));
}

OnNavigatedToAsync的{​​{1}}覆盖中,参数已正确传递。

现在,如果我们通过一个命令从BlankPage2ViewModel导航到BlankPage2ViewModel并传递另一个参数

BlankPage3ViewModel

同样有效,并将参数值public virtual DelegateCommand GoToPage3Command => new DelegateCommand(GoToPage3); public virtual async void GoToPage3() { await NavigationService.NavigateAsync("BlankPage3", null, ("param", 1234)); } 传递给1234

现在,如果我们导航回BlankPage3ViewModel

BlankPage2ViewModel

没有参数传递回await NavigationService.GoBackAsync();的{​​{1}}覆盖中。我们肯定会看到参数值OnNavigatedToAsync吗?

注意:我们还将每个视图中的BlankPage2ViewModel设置为5678

针对question asked over on the MSDN forums的类似问题的答案是:

  

如果您使用Frame.Navigate导航到同一页面,则不会重新创建PageA,但是将使用新参数调用OnNavigatedTo方法。

     

这样,您可以更改页面上显示的信息(如果需要,还可以进行一些转换);作为补充, Frame历史记录确实保留了先前的PageA参数,使您可以调用Frame.GoBack返回到先前的PageA状态

这是Prism设计中是否没有传回参数或潜在的错误?

1 个答案:

答案 0 :(得分:1)

正如@Bite所说,在一般的UWP项目中没有问题。当您调用Frame.Navigate(typeof(page), "params");方法在不同页面之间导航并调用Frame.GoBack()方法返回上一页时,参数仍然存在。

由于您正在使用Prism的导航服务,因此其中应该有一些不同的位置。如果您想了解详细的原因,则需要调试其Prism源代码,以了解其导航服务的原理。

在这里,我也对它的导航服务感兴趣,因此我花了一些时间研究它的源代码。导航服务的核心应该在NavigationService.csFrameFacade.cs中。

您可能会看到它最终将调用_frame.Navigate()方法从一个页面导航到另一页面。

var parameter = pageNavInfo.QueryString;
return _frame.Navigate(
                  sourcePageType: pageNavInfo.View,
                  parameter: parameter,
                  infoOverride: infoOverride);

_frame对象实际上是通用的UWP内置Frame Class类型。因此,通常,调用_frame.GoBack()返回上一页时,导航参数应该存在。

但是,如果添加一些断点来对其进行调试,则会发现在上面的null代码块中,参数的值始终为_frame.Navigate(sourcePageType: pageNavInfo.View,parameter:parameter,infoOverride: infoOverride);。这就是为什么在调用GoBack()方法时始终无法获取导航参数的原因。这是因为它始终将null作为参数传递给_frame.Navigate方法。它已经实现了自己的NavigationParameters。您传递给_navigationService.NavigateAsync()方法的所有参数都应在'_external'参数中。

enter image description here

因此,我已经告诉了您原因。我不能说这是设计使然或潜在的问题。也许,在调用“ GoBack()”方法时,他们没有考虑历史导航参数。您可以将问题提交给Github issue,以查看官方是否提供解决方法。或者,如果您对此感兴趣,则可以尝试更改其源代码并为您编译自己的自定义版本。