2012-01-19 10 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

(アイテムパネルが自然の中で仮想化されている場合、リストボックスなどのデフォルト)おそらく理由は、仮想化のため、視野の外のアイテムは彼らのために生成された一切の容器を持っていません。

ソースを割り当てて、同じメソッドでコンテナを取得しようとすると、ListBoxにまだ作成する時間がありませんでした。そのためには、UIスレッドはアイドル状態でなければなりません。

+0

UIスレッドを強制的に作成する方法はありますか?すべてを同じ機能に保ちたいのであれば?ただ疑問に思う。 – 0x4f3759df

+1

@iterationx:「ItemContainerGenerator」は[StatusChanged'イベントを発生させます。](http://msdn.microsoft.com/en-us/library/system.windows.controls.itemcontainergenerator.statuschanged .aspx)しかし、コンテナが生成されたときにあなたにそれを伝えるかもしれないので参考になるかもしれません。 –

関連する問題