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

Я получаю ошибку «Ссылка на объект не установлена ​​на экземпляр объекта» при попытке перезагрузить 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 из пути в приведенном выше XAML, я все равно получаю ошибку «Ссылка на объект», поэтому я не думаю, что проблема в том, что я пытается получить доступ к свойству Path для null . Вот' s Мой 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 , но это не t help - по-прежнему получаю ошибку «Ссылка на объект» при перезагрузке Designer.

Редактировать: свойство 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 связано, по-видимому.

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

30
задан Sarah Vessels 20 August 2010 в 22:15
поделиться

3 ответа

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

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

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

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

33
ответ дан 27 November 2019 в 23:45
поделиться

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

7
ответ дан 27 November 2019 в 23:45
поделиться

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

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

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

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

8
ответ дан 27 November 2019 в 23:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: