我刚刚在我的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
模式没有发生错误!
任何可能导致此问题的想法以及如何解决此问题?
感谢。
答案 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>();
}