Легкий тип MVVM не найден в кеше

Я пытаюсь преобразовать свое приложение Windows Phone 8 Silverlight в приложение 8.1 Phone как часть универсального приложения. Я не знаю, актуально ли это, потому что я впервые пытаюсь правильно реализовать модели представления. Я хочу обмениваться данными между представлениями в Windows и Windows Phone. Во всяком случае, это ошибка, которую я получаю.

Error   3   Type not found in cache: ScoreAlerts.ViewModel.FixturesViewModel.   C:\Users\Dave\Documents\Visual Studio 2012\Projects\Score Alerts\ScoreAlerts\ScoreAlerts.WindowsPhone\Pages\Fixtures.xaml   9   5   ScoreAlerts.WindowsPhone
Error   4   Type not found in cache: ScoreAlerts.ViewModel.HomePageViewModel.   C:\Users\Dave\Documents\Visual Studio 2012\Projects\Score Alerts\ScoreAlerts\ScoreAlerts.Shared\Pages\HomePage.xaml 34  9   ScoreAlerts.WindowsPhone

Вот как выглядит мой локатор модели представления

public class ViewModelLocator
{
    /// <summary>
    /// Initializes a new instance of the ViewModelLocator class.
    /// </summary>
    public ViewModelLocator()
    {
        if (!ViewModelBase.IsInDesignModeStatic)
        {
            ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

            if (ViewModelBase.IsInDesignModeStatic)
            {
                // Create design time view services and models
                //SimpleIoc.Default.Register<IDataService, DesignDataService>();
            }
            else
            {
                // Create run time view services and models
                //SimpleIoc.Default.Register<IDataService, DataService>();
            }

            SimpleIoc.Default.Register<HomePageViewModel>();
            SimpleIoc.Default.Register<FixturesViewModel>();
        }
    }

    [SuppressMessage("Microsoft.Performance",
        "CA1822:MarkMembersAsStatic",
        Justification = "This non-static member is needed for data binding purposes.")]
    public HomePageViewModel Main
    {
        get
        {
            //return ServiceLocator.Current.GetInstance<HomePageViewModel>();
            return SimpleIoc.Default.GetInstance<HomePageViewModel>("default");
        }
    }

    [SuppressMessage("Microsoft.Performance",
        "CA1822:MarkMembersAsStatic",
        Justification = "This non-static member is needed for data binding purposes.")]
    public FixturesViewModel Fixtures
    {
        get
        {
            //return ServiceLocator.Current.GetInstance<FixturesViewModel>();
            return SimpleIoc.Default.GetInstance<FixturesViewModel>("default");
        }
    }

    public static void Cleanup()
    {
        // TODO Clear the ViewModels
    }
}

Мой взгляд XAML имеет это

DataContext="{Binding Fixtures, Source={StaticResource Locator}}"

и в моем приложении есть это

<viewModel:ViewModelLocator x:Key="Locator"
                         d:IsDataSource="True"/>

Любые идеи, что я делаю неправильно?


person Real World    schedule 11.05.2014    source источник


Ответы (2)


Ответ был довольно простой ошибкой. Этот бит не выполнялся в режиме разработки

SimpleIoc.Default.Register<HomePageViewModel>();

Мой код для SimpleIoc.Default.Register(); находился внутри оператора if, который никогда не выполнялся в режиме разработки.

person Real World    schedule 19.05.2014
comment
То же самое здесь, и все же у меня есть еще десятки других ViewModels, зарегистрированных таким же образом. Не понимаю, почему этот выдает эту ошибку. Странно то, что он пустой и наследуется от того же абстрактного класса, что и остальные. Смущенный. Любые другие предложения? - person Thierry; 09.03.2016
comment
Когда вы говорите, что часть кода не выполнялась в режиме разработки, вы не говорите, как вы это исправили? Вы можете объяснить? - person Thierry; 09.03.2016
comment
Мой код для SimpleIoc.Default.Register<HomePageViewModel>(); находился внутри оператора if, который никогда не выполнялся в режиме разработки. См. блок кода в OP - person Real World; 09.03.2016

В моем случае целевой класс не реализовал конструктор без параметров. Единственный конструктор, который содержался в классе, принимал параметр байтового типа, поэтому я получал:

Тип не найден в кеше: System.Byte

Моя строка регистрации была такой:

SimpleIoc.Default.Register<IMyInterface, MyConcreteClass>();

Я добавил конструктор без параметров в MyConcreteClass, а затем применил к нему атрибут [PreferredConstructor] (этот атрибут доступен в пространстве имен GalaSoft.MvvmLight.Ioc) и избавился от проблемы.

Надеюсь, это поможет кому-то в будущем.

person dotNET    schedule 14.03.2018