WPF, «Ссылка на объект не установлена ​​на экземпляр объекта» в Designer - PullRequest
29 голосов
/ 20 августа 2010

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

<local:TemplateDetail Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="3"
    Width="600" TemplateData="{Binding ElementName=cbo_templates,
                               Path=SelectedItem.Data, Mode=OneWay}"/>

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

<ComboBox ItemsSource="{Binding Path=List}" Grid.Row="1" Grid.Column="3"
          VerticalAlignment="Center" x:Name="cbo_templates" Width="250"
          HorizontalAlignment="Left" DisplayMemberPath="Name"
          SelectedValuePath="Name" SelectedIndex="0"/>

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

Редактировать: вот код конструктора для обоих UserControl s:

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

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

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

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

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

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

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

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

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

<local:TemplateDetail Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="3"
                      TemplateData="{Binding}"/>

Что-то не нравится в том, что свойство TemplateData связано, по-видимому.

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

Ответы [ 8 ]

33 голосов
/ 20 августа 2010

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

Если ваш проект открыт в Visual Studio, откройте другой экземпляр Visual Studio и выберите Отладка-> Присоединить к процессу . В открывшемся диалоговом окне выберите

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

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

8 голосов
/ 20 августа 2010

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

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

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

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

7 голосов
/ 23 мая 2016

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

Если у вас есть 'Ссылка на объект не установлена ​​для экземпляра объектаВ XAML, но ваше приложение компилируется и работает нормально, вы обычно обнаруживаете, что его причина в конструкторе, который не может быть решен во время разработки.

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

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

См. здесь для получения подробной информации.

enter image description here

7 голосов
/ 20 августа 2010

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

2 голосов
/ 03 августа 2011

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

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

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

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

Работает превосходно.

0 голосов
/ 20 апреля 2018

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

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

0 голосов
/ 27 декабря 2017

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

<ResourceDictionary>
    <DataTemplate x:Key="ThisKeySolvesDesignersNullRef" 
                    DataType="local:MyViewModel">
        <local:MyControl/>
    </DataTemplate>
</ResourceDictionary>
0 голосов
/ 14 сентября 2015

В Visual Studio 2015 для WPF:

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

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

Если вы сделаете это в XAML, вы увидите только исключение, но не всплывающее окно с «Просмотр сведений об исключении», поэтому вам нужно сделать это в представлении «Дизайнер / Дизайн».

...