棱镜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容器处理这个有点不同,每个使用注册码的轻微变化,所有这些都很容易查找与棱镜是开放源码。

+0

谢谢!我没有在视图模型之外使用NavigationService。 “ItemViewModel”是一个视图模型。这不是页面的视图模型,如果这是你所指的。你有任何解决方案为我的情况?我不认为我的情况很特殊。 –

+0

目前正在考虑中。但除非Xamarin能够让我们获得View的父页面,否则我们无法支持它。 –

+0

但在我的情况下,它与视图无关。我正在创建一个子视图模型,我需要DI到navigationService才能工作。 –