Я получаю ошибку «Ссылка на объект не установлена на экземпляр объекта» при попытке перезагрузить 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
То, что говорит Алекс, - правильный путь. Но я думаю, что это немного сбивает с толку, чтобы понять, что он говорит.
Предполагая, что ваш проект открыт в Visual Studio, откройте другой экземпляр Visual Studio и выберите Отладка-> Присоединить к процессу . В открывшемся диалоговом окне выберите
XDesProc.exe
(который является конструктором пользовательского интерфейса XAML) для VS2012 и новее или devenv.exe
для более старых версий VS версий. Затем выполните «Reload Designer» для пользовательского элемента управления и просмотрите результат во втором экземпляре VS, чтобы проверить, в чем именно заключается ошибка.
Если ваш пользовательский элемент управления вызывает исключение во время разработки, вы можете отладить его. Для этого откройте проект Dll с этим пользовательским элементом управления в Visual Studio. Выберите другой экземпляр Visual Studio в качестве исполняемого файла для отладки. Начать отладку. Во втором (отлаженном) экземпляре Visual Studio используйте пользовательский элемент управления на клиентской странице XAML. Таким образом, вы можете отлаживать пользовательский элемент управления в режиме разработки.
Вероятно, это что-то в конструкторе ваших пользовательских элементов управления. У дизайнера VS2008 WPF есть некоторые проблемы с этим.
В проекте, который мы взяли на себя, мы добавили:
if (System.ComponentModel.DesignerProperties.GetIsInDesignMode(this))
{
return;
}
в начало конструктора пользовательских элементов управления, где это происходит, чтобы избежать этой ошибки.