Ошибка времени разработки 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

Другие вопросы по тегам