我使用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,是一个接口而不能 建造。你错过了类型映射吗?
有谁知道如何解决它? 谢谢
答案 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
的实现。