我可以在Prism的源代码中看到这个
Container.RegisterType<INavigationService, UnityPageNavigationService>(_navigationServiceName);
为什么使用特定名称?为什么不这样:
Container.RegisterType<INavigationService, UnityPageNavigationService>();
我在问,因为我在儿童视图模型上遇到了困难:
class ItemViewModel : BindableBase
{
public ItemViewModel(INavigationService navigationService)
{
}
}
我正在页面上创建项目:
class MainPageViewModel : BindableBase
{
public IEnumerable<ItemViewModel> Items { get; private set; }
public MainPageViewModel(Funct<ItemViewModel> itemFactory)
{
}
public void OnNavigatedTo(NavigationParameters parameters) {
Items = ... // Create items, where each item is created using itemFactory
}
}
但是DI失败了,它会抛出异常,因为它无法创建ItemViewModel
:
Microsoft.Practices.Unity.ResolutionFailedException:解析 依赖失败,type =“MyApp.ViewModels.ItemViewModel”,name = “(没有)”。 在解决时发生异常: 异常是:InvalidOperationException - 当前类型Prism.Navigation.INavigationService是一个接口,不能是 构造
你错过了类型映射吗?
答案 0 :(得分:1)
在Xamarin Forms中,导航基于从中导航的页面。因此,Prism Forms PageNavigationService必须知道与该特定服务实例相关联的页面。为了促进这一点,我们使用&#34;秘密&#34;键,然后解析服务并使用命名实例传递它&#34; navigationService&#34;供ViewModel使用。
除非您正在执行绝对导航(重置Application.MainPage),否则不应在ViewModel的上下文之外使用NavigationService。
请注意,每个DI容器处理的方式略有不同,每个容器使用注册密钥的轻微变化,所有这些都很容易查找Prism是开源的。