我试图将通用应用程序放在一起并且我使用mvvm light但是在编译应用程序时遇到以下错误:
Error 1 Type not found in cache: MyApp.Model.LocationModel
...\MyApp.WindowsPhone\Views\LocationPage.xaml 10 5 MyApp.WindowsPhone
它确实编译成功,但我无法弄清楚导致问题的原因。我在stackoverflow上发现了几篇文章:
SimpleIoC - Type not found in cache: Windows.UI.Xaml.Controls.Frame
MVVM Light “Type Not Found in cache”
但是没有一个适用于我的问题。我注意到的第一件事是错误以某种方式显示问题所在的模型,而不是ViewModel。
Error 1 Type not found in cache: MyApp.Model.LocationModel.
...\MyApp\MyApp.WindowsPhone\Views\LocationPage.xaml 10 5 MyApp.WindowsPhone
我的xaml中的错误发生在我定义DataContext的行上:
<Page
....
DataContext="{Binding Source={StaticResource Locator}, Path=LocationViewModel}">
我的LocationViewModel类定义如下:
public class LocationViewModel : ViewModelBase
{
private RelayCommand _saveCommand;
private RelayCommand _cancelCommand;
#region Properties
public int Id
{
get
{
return this.Location.Id;
}
}
public string Title
{
get
{
return this.Location.Title;
}
}
public string Description
{
get
{
return this.Location.Description;
}
}
public string CreatedDateFormatted
{
get
{
return this.Location.CreatedDate.ToString("d");
}
}
public string LastUpdatedDateFormatted
{
get
{
return Location.LastUpdatedDate.ToString("d");
}
}
public string ImagePath
{
get
{
return this.Location.ImagePath;
}
}
public LocationModel Location
{
get;
private set;
}
#endregion
#region Constructors
public LocationViewModel(LocationModel model)
{
this.Location = model;
this.Location.PropertyChanged += (s, e) =>
{
if (e.PropertyName == LocationModel.DescriptionPropertyName)
{
RaisePropertyChanged(() => Description);
}
if (e.PropertyName == LocationModel.TitlePropertyName)
{
RaisePropertyChanged(() => Title);
}
if (e.PropertyName == LocationModel.ImagePathPropertyName)
{
RaisePropertyChanged(() => ImagePath);
}
if (e.PropertyName == LocationModel.CreatedDateStringPropertyName)
{
RaisePropertyChanged(() => CreatedDateFormatted);
}
if (e.PropertyName == LocationModel.LastUpdatedDateStringPropertyName)
{
RaisePropertyChanged(() => LastUpdatedDateFormatted);
}
};
}
#endregion
public RelayCommand SaveCommand
{
get
{
return this._saveCommand ?? (this._saveCommand = new RelayCommand(ExecuteSaveCommand));
}
}
public RelayCommand CancelCommand
{
get
{
return this._cancelCommand ?? (this._cancelCommand = new RelayCommand(ExecuteCancelCommand));
}
}
private void ExecuteSaveCommand()
{
}
private void ExecuteCancelCommand()
{
}
}
我的LocationViewModel的属性在我的ViewModelLocator类中定义如下:
public LocationViewModel LocationViewModel
{
get
{
return ServiceLocator.Current.GetInstance<LocationViewModel>();
}
}
并在ViewModelLocator的构造函数中注册:
SimpleIoc.Default.Register<LocationViewModel>();
当调用此代码时,它会正确注册我的LocationViewModel。
点击我的&#34;添加&#34;按钮,它导航到LocationViewModel设置为DataContext的页面,并在运行时发生错误。
我来自LocationsViewModel
(而不是LocationViewModel
)的致电导航的代码是:
private void ExecuteAddCommand()
{
_navigationService.Navigate(typeof(LocationPage));
}
调试上面的内容时,会创建LocationPage,然后从ViewModelLocator调用LocationViewModel,这是在运行时发生同样的错误,即
return ServiceLocator.Current.GetInstance<LocationViewModel>();
当我将鼠标移到上面时,会显示以下内容:
Message: "Type not found in cache: MyApp.Model.LocationModel."
InnerException: at GalaSoft.MvvmLight.Ioc.SimpleIoc.DoGetService
(Type serviceType, String key) at
GalaSoft.MvvmLight.Ioc.SimpleIoc.GetInstance[TService]()
at Inventory.ViewModel.ViewModelLocator.get_LocationViewModel()
实际上,我刚刚意识到错误是在更早的时候生成的,但没有引发错误。它实际上是在ViewModelLocator的构造函数中注册LocationViewModel时生成的:
SimpleIoc.Default.Register<LocationViewModel>();
有什么想法吗?
感谢。
答案 0 :(得分:0)
LocationViewModel
构造函数依赖于LocationModel
。 SimpleIoc
容器无法创建视图模型实例,因为构造函数需要一个无法直接传递的LocationModel
对象。您可以使用MVVMLight Messenger
将LocationModel
对象与LocationViewModel
构造函数分离。
public LocationViewModel()
{
MessengerInstance.Register<LocationModel>(this,m=>{model=m;
//PropertyChanged code
});
}
在LocationsViewModel
中,只需发送LocationModel
构建器即可发送您想要使用的LocationViewModel
对象。
public void ExecuteAddCommand()
{
MessengerInstance.Send<LocationModel>(LocationModelObj);
_navigationService.navigate(tyepof(LocationPage));
}
为了使此成功,您需要注册LocationViewModel
以便在从LocationModel
发送对象之前注册接收LocationsViewModel
对象。因此,您需要使用SimpleIoc
Register
方法的重载来立即创建视图模型。
SimpleIoc.Default.Register<LocationViewModel>(true);
答案 1 :(得分:0)
基于@Shridhar所说的The SimpleIoc container couldn't create the view model instance as the constructor requires a LocationModel object which you can't pass directly
,我想我会尝试添加一个无参数构造函数,但是我又遇到了另一个错误,即
无法注册:在LocationViewModel中找到多个构造函数但是 没有标记为PreferredConstructor。
所以我用PreferredConstructor
标记了我的无参数构造函数:
[PreferredConstructor]
public LocationViewModel()
{
}
这解决了我的问题,但正如@Shridar所提到的,我不确定这是否是正确的解决方案,所以我会花更多的时间调查,看看这是否按预期工作,没有任何副作用。
我会尽快更新。
答案 2 :(得分:0)
我在尝试使用MVVMLight DialogService时也遇到了类似的错误;解决方案是确保它在ViewModelLocator中注册
public ViewModelLocator()
{
SimpleIoc.Default.Register<IDialogService, DialogService>();
}