У меня странная проблема, и я не могу найти ответы на нее.
Я создаю приложение Metro Store с Visual Studio 2012, используя MVVM Light через NuGet.
При разработке и добавлении xaml-кода контекста данных студия выдает мне красный глоток с ошибкой «Ссылка на объект не установлена на экземпляр объекта».
DataContext={Binding MainVM, Source={StaticResource Locator}}
В конце концов я сузил его до наследования в моей модели просмотра. У меня есть базовая модель представления, которую все мои модели представления наследуют от объявленной как таковой:
public class BaseViewModel : ViewModelBase
{
}
Тогда, очевидно, все мои модели просмотра как таковые:
public class MainViewModel : BaseViewModel
{
}
Теперь во время выполнения все работает отлично (что меня сбивает с толку), но режим разработки не работает.
Однако, если я удалю наследование и мои модели представления будут напрямую наследовать ViewModelBase, все будет хорошо в режиме дизайна:
public class MainViewModel : ViewModelBase
{
}
Я подумал, что, возможно, что-то в коде вызывает проблему, поэтому я закомментировал все, кроме того, что требовалось для компиляции и получения того же результата.
Кажется, у кого-то есть эта проблема или знает, что я делаю неправильно? Обычно я использую этот же шаблон при работе с приложениями Silverlight или WPF с использованием MVVM, и там все выглядит нормально.
Кстати, у моего ViewModelLocator есть свойство MainVM, которое возвращает класс MainViewModel.
ОБНОВЛЕНИЕ. Прочитав комментарии LBugnion и Уилла, я готовился к отладке режима дизайна, когда заметил, что по глупости забыл прокомментировать свой код в BaseViewModel. Я обнаружил, что там был код взлома. Режиму проектирования не понравилась следующая строчка:
private CoreDispatcher UIDispatcher = Windows.UI.Core.CoreWindow.GetForCurrentThread().Dispatcher;
Который я использовал для обновления потока пользовательского интерфейса в коде. Я предполагаю (кто-то более опытный может вмешаться) в режиме дизайна нет потока пользовательского интерфейса?
Обычно я использую свойство «IsInDesignMode», чтобы мои модели просмотра были практически нефункциональными для дизайна, но, видимо, я забыл сделать это здесь, поэтому я изменил строку выше на
private CoreDispatcher UIDispatcher = IsInDesignModeStatic ? null : Windows.UI.Core.CoreWindow.GetForCurrentThread().Dispatcher;
Мой лох