给出具有三个视图和相应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设计中是否没有传回参数或潜在的错误?
答案 0 :(得分:1)
正如@Bite所说,在一般的UWP项目中没有问题。当您调用Frame.Navigate(typeof(page), "params");
方法在不同页面之间导航并调用Frame.GoBack()
方法返回上一页时,参数仍然存在。
由于您正在使用Prism的导航服务,因此其中应该有一些不同的位置。如果您想了解详细的原因,则需要调试其Prism源代码,以了解其导航服务的原理。
在这里,我也对它的导航服务感兴趣,因此我花了一些时间研究它的源代码。导航服务的核心应该在NavigationService.cs和FrameFacade.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'参数中。
因此,我已经告诉了您原因。我不能说这是设计使然或潜在的问题。也许,在调用“ GoBack()”方法时,他们没有考虑历史导航参数。您可以将问题提交给Github issue,以查看官方是否提供解决方法。或者,如果您对此感兴趣,则可以尝试更改其源代码并为您编译自己的自定义版本。