Estoy tratando de vincular una gran colección a un ComboBox y tuve problemas de rendimiento al abrir la ventana emergente de ComboBox. Busqué en Internet y descubrí que usar VirtualizingStackPanel como plantilla de panel de elementos podría ayudar, pero me ayudó solo parcialmente. Si conecto una gran colección a un ComboBox, podría abrir una ventana emergente muy rápido, eso está bien, pero si después de eso uniré otra colección a un ComboBox e intentaré abrir el popup nuevamente, se volverá muy lento. Lo mismo está sucediendo si abre una ventana emergente para un ComboBox vacío, luego une una gran colección e intenta abrir la ventana emergente de nuevo; demora unos segundos antes de que se abra la ventana emergente.WPF Problemas de rendimiento de ComboBox vinculando colecciones grandes
Aquí es el XAML:
<ComboBox Name="cbBlah">
<ComboBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel />
</ItemsPanelTemplate>
</ComboBox.ItemsPanel>
</ComboBox>
y el código de ejemplo para la unión a reproducir el problema:
var list = new List<string>();
for (var i = 0; i < new Random().Next(9000, 10000); i++)
list.Add(i.ToString());
cbBlah.ItemsSource = list;
Traté de hacer la virtualización de panel de pila para tener este aspecto:
<VirtualizingStackPanel VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Recycling" />
pero no ayuda, parece que VirtualizationMode se ignora, por lo que las ventanas emergentes se abren muy rápido solo la primera vez y luego, cada vez que el enlace se modifica, es muy lento.
ACTUALIZACIÓN: Pensé en no vincular la nueva colección cada vez, pero unir un ObservableCollection una vez y luego simplemente cambiar su contenido. Lo mismo, tan pronto como el contenido de los cambios de recolección, abriendo una ventana emergente todavía tarda varios segundos :(
echar un vistazo a estas preguntas que le contesté http://stackoverflow.com/a/8555403/920384 – punker76