2012-01-19 4 views
0
<ListBox BorderThickness="0" x:Name="PendingChatListBox" HorizontalContentAlignment="Stretch"> 
    <ListBox.ItemTemplate > 
     <DataTemplate> 
      <Button Height="40" Click="OpenChat_click" Content="{Binding BindsDirectlyToSource=True, Converter={StaticResource cPendingUnreadMessagesConverter}}" HorizontalContentAlignment="Center" Background="Transparent" x:Name="OpenChatButton" Foreground="Blue"/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 
ObservableCollection<SideBarUnit> OpenChats = new ObservableCollection<SideBarUnit>(); 
this.PendingChatListBox.ItemsSource = OpenChats; 


if (PendingChatListBox.Items.Count > 0) 
{ 
    // WHY IS THIS OBJECT NULL? 
    object obj = PendingChatListBox.ItemContainerGenerator.ContainerFromItem(PendingChatListBox.Items[0]); 
} 
+1

Я бы рекомендовал * не * использовать 'ItemContainerGenerator' вообще, использовать привязку данных, если вам нужно изменить какие-либо свойства. –

+0

Не помогает, что ваш список пуст! – MyKuLLSKI

ответ

3

Вероятно, из-за виртуализации, элементы из поля зрения не имеют контейнера сгенерированного для них (если панель элементов является виртуализация в природе, по умолчанию для ListBoxes и т.п.).

Или, если вы назначили источник и попытаетесь получить контейнер в том же методе, у ListBox еще не было времени для его создания. Для этого UI-нить должна работать.

+0

Есть ли способ заставить поток пользовательского интерфейса создать его - если бы я хотел сохранить все в одной и той же функции? Просто интересуюсь. – 0x4f3759df

+1

@iterationx: Я ничего не знаю, 'ItemContainerGenerator' вызывает событие [' StatusChanged'] (http://msdn.microsoft.com/en-us/library/system.windows.controls.itemcontainergenerator.statuschanged .aspx), хотя это может быть полезно, поскольку оно может сказать вам, когда контейнер был сгенерирован. –

Смежные вопросы