WPF, «Ссылка на объект не установлена ​​в экземпляр объекта» в Designer

При попытке перезагрузить конструктор для моего XAML UserControl я получаю ошибку «Ссылка на объект, не установленную на экземпляр объекта». Visual Studio выделяет следующую строку как проблему:

  

TemplateDetail – это еще один UserControl . Когда я просматриваю TemplateDetail , его представление Designer загружается просто отлично, поэтому я не думаю, что там есть проблема. В моем XAML с именем cbo_templates есть cbo_templates который содержит экземпляры моего classа Template , который имеет свойство Data (следовательно, SelectedItem.Data ). Однако, если я .Data из Path в приведенном выше XAML, я все равно получаю ошибку «Ссылка на объект», поэтому я не думаю, что проблема в том, что я пытаюсь получить доступ к свойству Path на null . Вот мой ComboBox XAML на всякий случай:

  

Получение этой ошибки является реальной проблемой, поскольку представление Design не загружается, поэтому я не вижу, как выглядит мой UserControl не запуская приложение. Любая идея, что может быть неправильным? Он строит отлично, и я не вижу никаких проблем с привязкой в ​​Build Output.

Изменить: вот код конструктора для UserControl s:

Конструктор UserControl с ошибкой «Ссылка на объект»:

 InitializeComponent(); grd_templateList.DataContext = this; // refers to containing  in XAML 

Конструктор UserControl который я пытаюсь встроить, тот, чей вид дизайна загружается нормально:

 InitializeComponent(); grd_templateDetail.DataContext = this; // refers to containing  in XAML 

Редактирование: я попытался if (null != grd_templateList) проверку if (null != grd_templateList) в конструкторах перед установкой их свойств DataContext , но это не помогло – все равно получить ошибку «Ссылка на объект» при перезагрузке конструктора.

Изменить: свойство List которое использует ComboBox является DependencyProperty . У меня есть значение по умолчанию, установленное в методе Register :

 public static readonly DependencyProperty ListProperty = DependencyProperty.Register( "List", typeof(List), typeof(TemplateList), new PropertyMetadata( new List { _defaultTemplate } ) ); 

Даже если я попытаюсь инициализировать List в конструкторе для моего UserControl , я все равно получаю ошибку при перезагрузке конструктора. Я не думаю, что проблема в том, что List имеет значение null или SelectedItem.Data – это плохой путь.

Редактирование: хорошо, даже если это приводит к тому, что мой конструктор не загружается, что дает ошибку «Ссылка на объект»:

  

По-видимому, что-то не нравится в отношении свойства TemplateData .

Изменить: чтобы добавить к тайне, я могу просмотреть представление «Дизайн» моего общего / главного Window , которое включает в себя UserControl чье представление Design дает мне ошибку «Ссылка на объект». O_o

То, что говорит Алекс, – это путь. Но я думаю, что это немного запутывает, чтобы понять, что он говорит.

Предполагая, что ваш проект открыт в Visual Studio, откройте другой экземпляр Visual Studio и выберите Debug-> Attach To Process . В диалоговом окне, которое открывается, выберите

  • XDesProc.exe (который является дизайнером интерфейса XAML) для VS2012 и более поздних или
  • devenv.exe для старых версий VS.

Затем выполните «Перезагрузка конструктора» для пользовательского элемента управления и посмотрите результат во втором экземпляре VS, чтобы проверить, что именно представляет собой ошибка.

Вероятно, это что-то в конструкторе ваших пользовательских элементов управления. Разработчик WP200 VS2008 имеет некоторые проблемы с этим.

В проекте, который мы приняли, мы добавили:

 if (System.ComponentModel.DesignerProperties.GetIsInDesignMode(this)) { return; } 

к началу конструктора пользовательских элементов управления, где это происходит, чтобы избежать этой ошибки.

Если ваш пользовательский элемент управления выдает исключение во время разработки, вы можете его отладить. Для этого откройте проект Dll с помощью этого пользовательского элемента управления в Visual Studio. Выберите другой экземпляр Visual Studio как исполняемый файл для отладки. Начните отладки. Во втором (отлаженном) экземпляре Visual Studio используйте свой пользовательский элемент управления на странице клиента XAML. Таким образом, вы можете отлаживать пользовательский контроль в режиме разработки.

Эта ветка действительно старая, но я просто помещаю ее здесь для людей, которые имеют такую ​​же проблему, и приходят сюда через Google.

Если у вас есть ссылка «Объект ссылка не установлена ​​в экземпляр объекта» в XAML, но ваше приложение компилируется и работает нормально, вы, как правило, узнаете, что его причиной является что-то в конструкторе, который не может быть разрешен во время разработки.

Хотя вы можете узнать корень проблемы с помощью других ответов на этот вопрос, иногда это то, что вы не можете просто исправить, вам нужно это в вашем коде точно так же, как у вас есть, но вы не хотите см. эту ошибку.

В этом случае просто нажмите кнопку «Отключить код проекта», расположенную в нижней части дизайнерского представления, и дизайнер Visual Studio перестанет пытаться создать экземпляр, чтобы обеспечить представление данных времени разработки.

См. Здесь подробную информацию.

введите описание изображения здесь

Эта ветка немного старая, но у меня была проблема, которую я только что решил с ее помощью, поэтому я могу немного прояснить некоторые моменты.

  1. Как обычно, ваше решение загрузилось в Visual Studio.
  2. Откройте второй экземпляр VS, menu debug / attach для обработки / выбора devenv. Вы не увидите ничего захватывающего! В VS 2010 я просто получаю: «Разборка не может отображаться в режиме запуска».
  3. Вернитесь к первому экземпляру, где ваше решение открыто. Загрузите или перезагрузите поврежденный файл XAML. Если у вас есть проблема (у меня было исключение в пользовательском элементе управления, поэтому я не мог загрузить это окно), отладчик должен указать код нарушения во втором экземпляре. в моем случае это было очень ясно и очевидно.

Чтобы предотвратить нарушение кода во время разработки, я использовал

  If System.ComponentModel.LicenseUsageMode.Runtime = 1 Then myObject = New ObjectDefinition End If 

Работает отлично.

В Visual Studio 2015 для WPF:

  1. Наведите указатель мыши на «Ссылка на объект, не установленную на экземпляр объекта» в представлении «Дизайн».
  2. Подождите несколько (несколько) секунд (ы), и вы увидите всплывающее окно
  3. Выберите « Просмотреть сведения об исключении » (вы также увидите «Просмотреть код» и «Удалить этот элемент»,
  4. В этом диалоговом окне вы увидите исключение и StackTrace

Надеюсь это поможет.

Если вы сделаете это на XAML, вы увидите только исключение, но не всплывающее окно с «View Exception Details», поэтому вам нужно сделать это в представлении Designer / Design.

Я смог решить проблему после предоставления имени объекту. Это VS2015, и моя разметка отличается, но она тоже может помочь кому-то:

      

У меня была эта ошибка сегодня после редактирования большого количества XAML в моем коде UWP, и я не мог понять, что не так … но после некоторой тщательной проверки я заметил эту ошибку, которую я сделал:

  

Я по ошибке назначил свое командование обработчику Click, и это привело к исключению ссылочной ссылки … После изменения команды «Click to Command» ошибка исчезла.

Отчеты об ошибках XAML необходимо улучшить!

  • Связывание видимости DataGridTextColumn
  • наследовать стиль от стиля по умолчанию
  • Привязать к методу в WPF?
  • Передача значения enums в качестве параметра команды из XAML
  • Как заставить WPF использовать URI ресурсов, которые используют сильное имя сборки? Argh!
  • Как получить TextBox, чтобы принимать только числовые данные в WPF?
  • Значение * (звездочка) в WPF ColumnDefinition?
  • Как сортировать элементы TreeView с помощью SortDescriptions в Xaml?
  • Как применить правило пользовательской сортировки к WPF DataGrid?
  • Как установить событие MouseOver / триггер для границы в XAML?
  • Добавление объединенного словаря в объединенный словарь
  • Давайте будем гением компьютера.