Prism.Navigation.INavigationService,是一个无法构造的接口

时间:2017-04-28 15:48:48

标签: c# xamarin mvvm prism

我使用MVVM Prism获得了一个奇怪的异常。

这是我的代码:

LoginPageViewModel.cs文件:

    using Prism.Commands;
    using Prism.Mvvm;
    using Prism.Navigation;
    using Prism.Services;
    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.IO;
    using System.Linq;
    using Xamarin.Forms;
    using Prism.Unity;
    using Microsoft.Practices.Unity;
    using System.Threading.Tasks;
    using MobileApp.Views;

    namespace MobileApp.ViewModels
    {
        public class LoginPageViewModel : BindableBase, INavigationAware
        {

            .
            .
            .
            private INavigationService _navigationService;

            public LoginPageViewModel(INavigationService navigationService, ...)
            {
                .
                .
                .
                _navigationService = navigationService;
            }
        }
    }

我调用LoginPage的App.xaml.cs文件:

    using Prism.Unity;
    using MobileApp.Views;
    using Xamarin.Forms;
    using System;
    using System.Globalization;
    using Microsoft.Practices.Unity;
    using Prism.Navigation;
    using Microsoft.Practices.ServiceLocation;
    using System.Diagnostics;
    using MobileApp.ViewModels;
    using System.Threading.Tasks;

    namespace MobileApp
    {
        public partial class App : PrismApplication
            {
                public App(IPlatformInitializer initializer = null) : base(initializer)
                {

                }

                protected override void OnInitialized()
                {
                    NavigationService.NavigateAsync("LoginPage"); // ERROR here (Exception)
                    .
                    .
                    .
                }

                protected override void RegisterTypes()
                {

                    Container.RegisterTypeForNavigation<NavigationPage>();
                    Container.RegisterTypeForNavigation<LoginPage>();
                    .
                    .
                    .
                }
        }
    }

在NavigationService.NavigateAsync(&#34; LoginPage&#34;)调用之后,我收到此错误:

  

System.InvalidOperationException:当前类型,   Prism.Navigation.INavigationService,是一个接口而不能   建造。你错过了类型映射吗?

有谁知道如何解决它? 谢谢

2 个答案:

答案 0 :(得分:2)

首先,您可以尝试使OnInitialized异步,等待NavigateAsync并将整个事件包装在try catch中,并为任何异常调试输出。

其次,虽然这里的内容看起来是正确的,但是当导航服务名称中出现拼写错误时,通常会发生此错误。 Unity注入导航服务的方式必须完全正确,否则无法解析。您可以尝试从Unity切换到DryIoc,看看是否能解决您的问题。它也是一个更快的DI容器,并实际维护!

答案 1 :(得分:1)

我有同样的问题。我尝试将OnInitialized标记为async,并在nameof中使用了NavigationService.NavigateAsync来避免输入错误,但是它没有用。万一其他人有同样的问题,我在RegisterTypes的开头添加了这一行后就解决了:

Container.Register<Prism.Navigation.INavigationService, Prism.Navigation.PageNavigationService>();

它将PageNavigationService注册为INavigationService的实现。