为什么 RequestNavigate 上没有错误到不存在的视图

Why no error on RequestNavigate to non-existent view

我有一个只有一个区域的小型测试应用程序。我想使用 RequestNavigate() 功能来更改此区域中显示的视图。

我可以注册我的观点,并且可以导航到它们。例如:

Container.RegisterType<object, MyView>("MyView");
var regionManager = Container.Resolve<IRegionManager>();

// This navigation works ....
regionManager.RequestNavigate("MainRegion", "MyView", OnNavigated);

但是,由于用户输入涉及到选择视图(在实际应用中,视图在不同的模块中注册,彼此不了解),我想检查导航是否成功。但是当我导航到我注册了 NOT 的视图时,导航成功并且用户得到一个显示字符串 "System.Object" 且没有其他内容的屏幕。

例如:

// This navigation also succeeds!?
regionManager.RequestNavigate("MainRegion", "MissingView", OnNavigated);

如何判断我是否尝试导航到不存在的视图?
为什么 NavigationResult.ResultOnNavigated 回调中设置为 true

这就是它在 Prism 中的实现方式。该区域首先尝试通过提供的类型名称获取所有导航目标候选视图;如果成功,它会检查一些额外的东西(例如,视图是否实现 INavigationAware,如果是 - 调用 INavigationAware.IsNavigationTarget())。如果没有可以通过提供的类型名称找到的视图,将创建一个新视图并将其添加到该区域:

protected virtual object CreateNewRegionItem(string candidateTargetContract)
{
    object newRegionItem;
    newRegionItem = this.serviceLocator.GetInstance<object>(candidateTargetContract);
    return newRegionItem;
}

这里是重要的方法调用serviceLocator.GetInstance<object>()。 根据this,

If you call the Resolve method and specify a name as well as the registration type, and there is no mapping registered for that type and name, the container will attempt to create an instance of the type you resolved.

所以这就是为什么您会看到带有 System.Object 字符串的空视图:Prism 只是创建一个 System.Object 视图并将其添加到地区;然后 returns 一个像这样的导航结果对象:new NavigationResult(navigationContext, true).

因此一个可能的解决方案是在导航到视图之前检查提供类型的视图是否已在容器中注册。