42 votes

ItemContainerGenerator.ContainerFromItem() renvoie null ?

J'ai un comportement un peu bizarre que je n'arrive pas à comprendre. Lorsque je parcours les éléments de ma propriété ListBox.ItemsSource, je n'arrive pas à obtenir le conteneur ? Je m'attends à voir un ListBoxItem renvoyé, mais je n'obtiens que null.

Des idées?

Voici le bout de code que j'utilise :

 this.lstResults.ItemsSource.ForEach(t =>
    {
        ListBoxItem lbi = this.lstResults.ItemContainerGenerator.ContainerFromItem(t) as ListBoxItem;

        if (lbi != null)
        {
            this.AddToolTip(lbi);
        }
    });

ItemsSource est actuellement défini sur un dictionnaire et contient un certain nombre de KVP.

19voto

Sonny Boy Points 2931

Enfin résolu le problème... En ajoutant VirtualizingStackPanel.IsVirtualizing="False" dans mon XAML, tout fonctionne maintenant comme prévu.

En revanche, je manque tous les avantages de performance de la virtualisation, j'ai donc changé mon routage de charge en async et ajouté un "spinner" dans ma liste pendant qu'il se charge...

15voto

epox_spb Points 281
object viewItem = list.ItemContainerGenerator.ContainerFromItem(item);
if (viewItem == null)
{
    list.UpdateLayout();
    viewItem = list.ItemContainerGenerator.ContainerFromItem(item);
    Debug.Assert(viewItem != null, "list.ItemContainerGenerator.ContainerFromItem(item) is null, even after UpdateLayout");
}

5voto

Amir Points 206

Utilisez cet abonnement :

 TheListBox.ItemContainerGenerator.StatusChanged += (sender, e) =>
{
  TheListBox.Dispatcher.Invoke(() =>
  {
     var TheOne = TheListBox.ItemContainerGenerator.ContainerFromIndex(0);
     if (TheOne != null)
       // Use The One
  });
};

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X