Prism XF:创建'子'视图模型的问题

时间:2017-09-26 07:25:37

标签: xamarin.forms prism

我可以在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是一个接口,不能是   构造

你错过了类型映射吗?

1 个答案:

答案 0 :(得分:1)

在Xamarin Forms中,导航基于从中导航的页面。因此,Prism Forms PageNavigationService必须知道与该特定服务实例相关联的页面。为了促进这一点,我们使用&#34;秘密&#34;键,然后解析服务并使用命名实例传递它&#34; navigationService&#34;供ViewModel使用。

除非您正在执行绝对导航(重置Application.MainPage),否则不应在ViewModel的上下文之外使用NavigationService。

请注意,每个DI容器处理的方式略有不同,每个容器使用注册密钥的轻微变化,所有这些都很容易查找Prism是开源的。