在缓存中找不到类型 - UWP Windows 10

时间:2016-03-09 04:02:33

标签: c# mvvm win-universal-app mvvm-light

我刚刚在我的UWP项目中添加了一个新的View和ViewModel,它使用了MVVMLight,我花了最近几个小时试图找出这个和新文件之间但看不到任何不同。

这可能是一个重复的帖子MVVM Light “Type Not Found in cache",但我觉得它从未得到过真正的回答。

无论如何,我已经在我的ViewModelLocator中声明了十几个或更多的ViewModel,它们都按预期工作,除了我的新定义与其他定义完全相同:

SimpleIoc.Default.Register<UnlockFeaturesPageViewModel>();

我的ViewModel声明如下:

public class UnlockFeaturesPageViewModel : AbstractPageViewModel
{
    public UnlockFeaturesPageViewModel(ITelemetryService telemetryService,
           IDataService dataservice, CurrentPageEnum currentPage) : 
           base(telemetryService, dataservice,
           CurrentPageEnum.UnlockFeatures)
}

正如您所看到的,它继承自AbstractPageViewModel,并且抽象类也非常直接:

public abstract class AbstractPageViewModel : ViewModelBase, IPageViewModel
{
    public AbstractPageViewModel(ITelemetryService telemetryService,
           IDataService dataservice, CurrentPageEnum currentPage) 
    {
        this._telemetryService = telemetryService;
        this._dataService = dataservice;
        this._currentPage = currentPage;
    }
}

它包含其他属性,如果需要可以覆盖的方法。 ViewModelBase是来自Galasoft.MVVMLight的类,而IPageViewModel是一个基本接口。

当InitialComponents();在CodeBehind中调用并尝试初始化DataContext,其定义如下:

<Page x:Class="MyApp.Views.UnlockFeaturesPage"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:local="using:MyApp.Views"
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
      mc:Ignorable="d"
      DataContext="{Binding Source={StaticResource Locator},
                    Path=UnlockFeaturesViewModel}" >

然后从ViewModelLocator调用以下代码,这是发生错误的地方:

public UnlockFeaturesPageViewModel UnlockFeaturesPageViewModel
{
    get
    {
        return ServiceLocator.Current.
        GetInstance<UnlockFeaturesPageViewModel>();
    }
}

如果我将鼠标移到鼠标上方,则会显示以下错误:

'UnlockFeaturesPageViewModel' threw an exception of type 
'System.Reflection.TargetInvocationException'

当我执行代码时,它会抛出以下错误:

TargetInvocationException was unhandled by user code

An exception of type 'System.Reflection.TargetInvocationException' 
occurred in mscorlib.ni.dll but was not handled in user code.

并且InnerException包含以下详细信息:

Message: Type not found in cache: MyApp.Constants.CurrentPageEnum.
Source: GalaSoft.MvvmLight.Extras
StackTrace: at GalaSoft.MvvmLight.Ioc.SimpleIoc.DoGetService(Type
            serviceType, String key, Boolean cache) at
            GalaSoft.MvvmLight.Ioc.SimpleIoc.MakeInstance[TClass]()

那么为什么我在缓存中找不到关于MyApp.Constants.CurrentPageEnum的错误。我已经为我的CurrentPageEnum添加了一个新值以匹配新添加的页面,但是根据错误,它被缓存到某个地方而且没有更新。我可能完全错了,但我想不出别的,因为代码与其他可用的ViewModel相同。

它与我的AbstractPageViewModel完全相关,好像我的UnlockFeatureViewModel继承自ViewModelBase(来自Galasoft.MVVMLight),它不会抛出任何错误。

关于为什么这可能是一个重复的帖子是因为在其他类似的帖子中,开发人员提到它只是没有在调试模式下执行以下行,但他没有提到他是如何修复它的。

SimpleIoc.Default.Register<UnlockFeaturesPageViewModel>();

我的问题是,它似乎是在调试模式下执行,因为我正在逐步执行它并进入下一行,如上所述,只有在尝试将我的页面的DataContext设置为特定时才会出现错误查看模型。

奇怪的是Release模式没有发生错误!

任何可能导致此问题的想法以及如何解决此问题?

感谢。

2 个答案:

答案 0 :(得分:2)

你的UnlockFeaturesPageViewModel有一个enum作为依赖。

public class UnlockFeaturesPageViewModel : AbstractPageViewModel
{
    public UnlockFeaturesPageViewModel(ITelemetryService telemetryService,
           IDataService dataservice, CurrentPageEnum currentPage) :  // This one, CurrentPageEnum do not belong here, it's enum and can't be resolved
           base(telemetryService, dataservice,
           CurrentPageEnum.UnlockFeatures)
}

由于CurrentPageEnum不是可以实例化的类,因此解析失败。

你应该删除这样的枚举

public class UnlockFeaturesPageViewModel : AbstractPageViewModel
{
    public UnlockFeaturesPageViewModel(ITelemetryService telemetryService,
           IDataService dataservice) :
           base(telemetryService, dataservice,
           CurrentPageEnum.UnlockFeatures)
}

答案 1 :(得分:-1)

之前我遇到此错误,当ServiceLocator尝试在viewmodel中注入所有服务时会产生此错误。 我不确定它是MVVM灯还是其他东西的错误。我在viewmodels的构造函数中总是使用ServiceLocator解决了这个问题,用于调用我的所有服务而不修改所有viewmodel的构造函数。 例如:

Public MyViewModel()
{
  var myService= ServiceLocator.Current.GetInstance<IMyService>();

}