C# WPF: добавление пользовательского элемента управления UserControl в Stackpanel

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

мой пользовательский элемент управления выглядит так:

public partial class ShiftInformationItem : UserControl
{
    public ShiftInformationItem()
    {
        InitializeComponent();
    }
}

и XAML:

<Grid>
    <LabelContent="Benutzername:" />
    <Label Content="01.03.2014 14:19" />
    <TextBox Text="Eintrag ..." />
    <Expander Header="Comments (0)">
        <Grid Background="#FFE5E5E5"/>
    </Expander>
</Grid>

Внутри главного окна я могу добавить его в список или панель стека без каких-либо проблем:

<ListBox>
     <controls:ShiftInformationItem  />
</ListBox>

or:

<StackPanel Name="ShiftInformationPanel">
     <controls:ShiftInformationItem  />
</StackPanel>

Но когда я пытаюсь добавить его с помощью С#:

ShiftInformationList.Items.Add(new ShiftInformationItem());
ShiftInformationPanel.Children.Add(new ShiftInformationItem());

он вызывает NullReferenceException и сообщает, что объект, который я хочу добавить, является нулевым.

Кто-нибудь может объяснить мне, почему?

Я очень благодарен за все благонамеренные и полезные ответы заранее!

ОБНОВИТЬ:

public partial class HoBusReceptionMain : Window
{
    public HoBusReceptionMain()
    {
        InitializeComponent();
    }

    private void RibbonWin_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        RibbonTab r = (RibbonTab)e.AddedItems[0];
        switch (r.Header.ToString())
        {
            case "Shift Information":
                InitializeShiftInformationTab();
                break;
            default:
                MessageBox.Show(e.AddedItems[0].ToString());
                break;
        }
    }

    private void InitializeShiftInformationTab()
    {
        //here I want to add the new ShiftInformationItem
    }

}

ОБНОВЛЕНИЕ 2:

Спасибо всем комментариям, оказывается, что мой список || Панель нулевая... Но обе включены в главное окно (выше HoBusReceptionMain)

Я использую ленты в своем приложении, и когда вкладка ленты выбрана или загружена, запускается событие RibbonWin_SelectionChanged... Список или панель, определенные ниже определений ленты


person Tobias Raphael Dieckmann    schedule 01.03.2014    source источник


Ответы (1)


Я подозреваю, что вы добавляете это до того, как будет вызван InitializeComponent().

Переместите код добавления ниже InitializeComponent(), и он будет работать так же, как в XAML. Проблема в том, что элементы управления не были инициализированы до вызова InitializeComponent(), что привело к NullReferenceException.

public MainWindow()
{
    InitializeComponent();
    ShiftInformationList.Items.Add(new ShiftInformationItem());
    ShiftInformationPanel.Children.Add(new ShiftInformationItem());
    // ShiftInformationPanel is null here
}
person Rohit Vats    schedule 01.03.2014
comment
Добавления находятся в другом скрипте кода, инициализация ShiftInformationItem должна вызываться в новом ShiftInformationItem() - person Tobias Raphael Dieckmann; 01.03.2014
comment
ShiftInformationPanel равно нулю, а не ShiftInformationItem. Убедитесь, что скрипт кода запускается после инициализации пользовательского интерфейса. - person Rohit Vats; 01.03.2014
comment
Извините, вы неправильно поняли, может быть, я не совсем понятно объяснил. ShiftInformationList.Items.Add(new ShiftInformationItem()); ShiftInformationPanel.Children.Add(новый ShiftInformationItem()); вызывается в моем главном окне, куда я хочу добавить ShiftInformationItem - person Tobias Raphael Dieckmann; 01.03.2014
comment
ни мой список, ни моя панель не могут быть нулевыми, это после инициализации - person Tobias Raphael Dieckmann; 01.03.2014
comment
Я правильно написал с ошибкой в ​​своем ответе. Я имел в виду, что код добавления должен запускаться только после MainWindow's InitializeComponent. - person Rohit Vats; 01.03.2014
comment
Можете ли вы увидеть с подключенным отладчиком, какое значение оценивается как нулевое? - person Rohit Vats; 01.03.2014
comment
черт возьми, ребята, вы правы, мой список || Панель действительно нулевая... Очевидно, что событие ChangeEvent срабатывает до того, как оно инициализировано... Но как это возможно? и что более важно: как мне этого избежать? - person Tobias Raphael Dieckmann; 01.03.2014
comment
Где объявлено ShiftInformationList? Где этот SelectionChanged зацепился? - person Rohit Vats; 01.03.2014
comment
Оба они объявлены в моем главном окне (HoBusReceptionMain). - person Tobias Raphael Dieckmann; 01.03.2014
comment
Пожалуйста, добавьте подробности в вопросе. В противном случае все это будет работать догадки без него. Я имел в виду то, как оно объявлено и как для него зацеплено событие, потому что в идеальном случае оно не будет нулевым. - person Rohit Vats; 01.03.2014
comment
@TobiasRaphaelDieckmann, извините, что не по теме, но вы, похоже, искали решение для ЭТА ПРОБЛЕМА, как только вы ее увидите, отметьте этот комментарий для удаления - person ; 01.04.2014