在缓存中找不到类型

时间:2014-12-30 05:53:18

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

我试图将通用应用程序放在一起并且我使用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>();

有什么想法吗?

感谢。

3 个答案:

答案 0 :(得分:0)

LocationViewModel构造函数依赖于LocationModelSimpleIoc容器无法创建视图模型实例,因为构造函数需要一个无法直接传递的LocationModel对象。您可以使用MVVMLight MessengerLocationModel对象与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>();
}