我有一个小区域的测试应用程序。我想使用RequestNavigate()
功能更改此区域中显示的视图。
我可以注册我的观点,并可以导航到它们。例如:
Container.RegisterType<object, MyView>("MyView");
var regionManager = Container.Resolve<IRegionManager>();
// This navigation works ....
regionManager.RequestNavigate("MainRegion", "MyView", OnNavigated);
然而,由于用户输入涉及选择视图(并且在真实应用中,视图在不同模块中注册而彼此不了解),我想检查导航是否成功。但是当我导航到我已经 NOT 注册的视图时,导航成功并且用户获得一个带有字符串&#34; System.Object&#34;的屏幕。显示,没有别的。
例如:
// This navigation also succeeds!?
regionManager.RequestNavigate("MainRegion", "MissingView", OnNavigated);
如何判断我是否尝试导航到不存在的视图?
为什么NavigationResult.Result
在true
回调中设置为OnNavigated
?
答案 0 :(得分:1)
它是如何在Prism中实现的。该区域首先尝试通过提供的类型名称获取所有导航目标候选视图;如果成功,它会检查一些其他内容(例如,视图是否实现INavigationAware
,如果是,则调用INavigationAware.IsNavigationTarget()
)。如果没有可通过提供的类型名称找到的视图,则将创建一个新视图并将其添加到该区域:
protected virtual object CreateNewRegionItem(string candidateTargetContract)
{
object newRegionItem;
newRegionItem = this.serviceLocator.GetInstance<object>(candidateTargetContract);
return newRegionItem;
}
这是方法调用serviceLocator.GetInstance<object>()
重要的。
根据{{3}},
如果您调用Resolve方法并指定名称和注册类型,并且没有为该类型和名称注册映射,则容器将尝试创建您已解析类型的实例。
这就是为什么你看到一个带有 System.Object 字符串的空视图的原因:Prism只是创建一个System.Object
的视图并将其添加到该区域;然后返回如下导航结果对象:new NavigationResult(navigationContext, true)
。
因此,可能的解决方案是在导航到视图之前检查容器中是否已注册所提供类型的视图。