棱镜XF:问题与创建“孩子”视图模型
问题描述:
我可以在棱镜的源代码中看到这个棱镜XF:问题与创建“孩子”视图模型
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 = “(none)”。 发生异常时:解析时。 异常是:InvalidOperationException - 当前类型Prism.Navigation.INavigationService是一个接口,不能由 构造。
您是否缺少类型映射?
答
Xamarin表单导航基于正在导航的页面。因此,Prism Forms PageNavigationService必须知道与该特定服务实例关联的页面。为了实现这一点,我们使用“秘密”键注册该服务,然后解析该服务并使用ViewModel的命名实例“navigationService”传递该消息。
除非您正在执行绝对导航(重置Application.MainPage),否则您不应该在ViewModel的上下文之外使用NavigationService。
请注意,每个DI容器处理这个有点不同,每个使用注册码的轻微变化,所有这些都很容易查找与棱镜是开放源码。
谢谢!我没有在视图模型之外使用NavigationService。 “ItemViewModel”是一个视图模型。这不是页面的视图模型,如果这是你所指的。你有任何解决方案为我的情况?我不认为我的情况很特殊。 –
目前正在考虑中。但除非Xamarin能够让我们获得View的父页面,否则我们无法支持它。 –
但在我的情况下,它与视图无关。我正在创建一个子视图模型,我需要DI到navigationService才能工作。 –