Ошибка времени разработки WPF Ссылка на объект не установлена для экземпляра объекта
Хорошо, я заболел этой проблемой.
Я пытаюсь сделать UserControl, где я могу заполнить его содержимое из XAML. Ранее я создал ObservableCollection DependencyProperty. Он работал во время выполнения, но во время разработки произошла ошибка:
В экземпляре объекта не задана ссылка на объект.
Сейчас я сделал более простую версию:
public partial class UC : UserControl
{
public UC()
{
Labels = new ObservableCollection<Label>();
InitializeComponent();
Labels.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(Labels_CollectionChanged);
}
void Labels_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
foreach (Label uc in e.NewItems)
Container.Children.Add(uc);
}
private ObservableCollection<Label> _lables = new ObservableCollection<Label>();
public ObservableCollection<Label> Labels
{
get { return _lables; }
set { _lables = value; }
}
}
Вот как мне нравится использовать мой UserControll
<Window x:Class="WpfApplication1.MainWindow"
xmlns:gsh="clr-namespace:WpfApplication1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid Margin="0,0,0,30">
<gsh:UC x:Name="uC1">
<gsh:UC.Labels>
<Label Content="qwerty1" />
<Label Content="qwerty2" />
</gsh:UC.Labels>
</gsh:UC>
</Grid>
Однако это все еще дает мне ошибку во время разработки:
В экземпляре объекта не задана ссылка на объект.
Так что если кто-нибудь может мне помочь, пожалуйста.
Как я могу сделать UserControl, который я могу использовать как родные элементы управления, которые я могу заполнить коллекцией элементов? Я пытаюсь найти ответ уже второй день.
1 ответ
Я обычно проверяю, не нахожусь ли я во время разработки, прежде чем подключать события и т.д..
Возможно, ваш Контейнер пуст в режиме разработки.
public class Utils
{
public static bool IsInDesignerMode
{
get
{
return ((bool)(DesignerProperties.IsInDesignModeProperty
.GetMetadata(typeof(DependencyObject)).DefaultValue));
}
}
}
Может быть, в вашем конструкторе вы должны сделать это..
public UC()
{
InitializeComponent();
if (!Utils.IsInDesignerMode)
{
Labels = new ObservableCollection<Label>();
Labels.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(Labels_CollectionChanged);
}
}
С другой стороны, хотя я думаю, что вам лучше использовать ItemsControl