Sto cercando di associare una grande raccolta a un ComboBox e ho riscontrato problemi di prestazioni all'apertura del popup di ComboBox. Ho cercato su Internet e ho scoperto che l'uso di VirtualizingStackPanel come modello di pannello di elementi poteva essere d'aiuto, ma ha aiutato solo parzialmente. Se lego una grande collezione a un ComboBox, potrei aprire popup velocemente, va bene, ma se poi lego un'altra raccolta a un ComboBox e provo ad aprire nuovamente popup, diventa molto lenta. Lo stesso sta accadendo se apri un popup per un ComboBox vuoto, poi leghi una grossa collezione e tenti di aprire nuovamente il popup - ci vogliono alcuni secondi prima che il popup si apra.Problemi di prestazioni di ComboBox WPF vincolando raccolte di grandi dimensioni
Ecco il codice XAML:
<ComboBox Name="cbBlah">
<ComboBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel />
</ItemsPanelTemplate>
</ComboBox.ItemsPanel>
</ComboBox>
e il codice di esempio per il legame per riprodurre il problema:
var list = new List<string>();
for (var i = 0; i < new Random().Next(9000, 10000); i++)
list.Add(i.ToString());
cbBlah.ItemsSource = list;
ho cercato di rendere la virtualizzazione pannello stack a questo aspetto:
<VirtualizingStackPanel VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Recycling" />
ma non aiuta, sembra VirtualizationMode viene ignorato in modo popup apre molto velocemente solo la prima volta e quindi, ogni volta dopo aver eseguito il binding delle modifiche, è molto lento.
UPDATE: Ho pensato di non legare la nuova raccolta ogni volta, ma di associare una ObservableCollection una volta e poi di cambiarne il contenuto. Stessa cosa, non appena il contenuto delle modifiche di raccolta, l'apertura di un pop-up ancora richiede alcuni secondi :(
un'occhiata a queste domande che ho risposto http://stackoverflow.com/a/8555403/920384 – punker76