Problèmes de performances de WPF ComboBox en liant une grande collection

J’essaie de lier une grande collection à une ComboBox et j’ai rencontré des problèmes de performance lors de l’ouverture de la fenêtre contextuelle de ComboBox. J’ai cherché sur Internet et j’ai constaté que l’utilisation de VirtualizingStackPanel en tant que modèle de panneau d’éléments pouvait aider, mais cela n’a aidé que partiellement. Si je lie une grande collection à un ComboBox, je pourrais ouvrir très rapidement un popup, mais si je lie ensuite une autre collection à un ComboBox et que j’essaye de réouvrir le popup, cela devient très lent. La même chose se produit si vous ouvrez une fenêtre contextuelle pour une zone de liste déroulante vide, puis liez une grande collection et essayez d’ouvrir à nouveau la fenêtre contextuelle – cela prend quelques secondes avant que la fenêtre contextuelle s’ouvre.

Voici le XAML:

       

et l’exemple de code pour la liaison pour reproduire le problème:

 var list = new List(); for (var i = 0; i < new Random().Next(9000, 10000); i++) list.Add(i.ToString()); cbBlah.ItemsSource = list; 

J’ai essayé de faire en sorte que le panneau de stack de virtualisation ressemble à ceci:

  

mais cela n’aide pas, apparemment VirtualizationMode est ignoré, donc la fenêtre contextuelle s’ouvre très rapidement la première fois et ensuite, à chaque modification de la liaison, elle est très lente.

MISE À JOUR : J’ai pensé à ne pas lier une nouvelle collection à chaque fois, mais à lier une fois ObservableCollection, puis à en modifier simplement le contenu. Même chose, dès que le contenu de la collection change, l’ouverture d’une fenêtre prend plusieurs secondes 🙁

Selon ce blog: http://vbcity.com/blogs/xtab/archive/2009/12/15/wpf-using-a-virtualizingstackpanel-to-improve-combobox-performance.aspx

Je l’ai testé avec ce code:

        

Cela fonctionne bien pour la première fois et les prochaines fois. Il n’est pas nécessaire de coder ces lignes:

  

J’espère que ceci vous aide.

J’ai eu le problème avec des performances lentes aussi. Mais j’avais créé une classe qui héritait de la forme Combobox, c’est pourquoi je voudrais le faire par programmation. Donc, voici la solution pour les autres googleurs.

 ItemsPanel = new ItemsPanelTemplate(); var stackPanelTemplate = new FrameworkElementFactory(typeof (VirtualizingStackPanel)); ItemsPanel.VisualTree = stackPanelTemplate; 

Je viens de rencontrer ce problème aussi. J’utilise ce code dans une boîte combinée personnalisée avec un modèle de style. Lorsque j’ai exécuté mon code en mode de débogage VS, la virtualisation ne fonctionnait pas correctement. Une fois que je l’ai exécuté en dehors du débogage, je peux changer le contenu de ObservableCollection sans verrouiller l’interface utilisateur. Cela peut aussi aider si vous définissez une hauteur maximale et une largeur maximale.