Подтвердить что ты не робот

WPF, "Ссылка на объект не установлена ​​в экземпляр объекта" в 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, его представление конструктора загружается просто отлично, поэтому я не думаю, что там есть проблема. В моем XAML с именем cbo_templates есть ComboBox, который содержит экземпляры моего класса Template, который имеет свойство Data (следовательно, SelectedItem.Data). Однако, если я удаляю .Data из Path в вышеупомянутом XAML, я все равно получаю ошибку "Ссылка на объект" , поэтому я не думаю, что проблема в том, что я пытаюсь получить доступ к свойству Path на null. Здесь my 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, не запуская приложение. Любая идея, что может быть неправильным? Он строит отлично, и я не вижу никаких проблем с привязкой в ​​Build Output.

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

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

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

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

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 имеет значение null или SelectedItem.Data является плохим путем.

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

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

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

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

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

Хорошо работает.

Ответ 5

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

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

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

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

Подробнее см. здесь.

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

Ответ 6

В Visual Studio 2015 для WPF:

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

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

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

Ответ 7

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

<ResourceDictionary>
    <DataTemplate x:Key="ThisKeySolvesDesignersNullRef" 
                    DataType="local:MyViewModel">
        <local:MyControl/>
    </DataTemplate>
</ResourceDictionary>