Я пытаюсь привязать большую коллекцию к ComboBox, и у меня возникли проблемы с производительностью при открытии всплывающего окна ComboBox. Я поискал в Интернете и обнаружил, что использование VirtualizingStackPanel в качестве шаблона панели элементов может помочь, но помогло лишь частично.Если я привяжу большую коллекцию к ComboBox, я смогу открыть всплывающее окно очень быстро, это нормально, но если после этого я привяжу другую коллекцию к ComboBox и снова попытаюсь открыть всплывающее окно, это станет очень медленным. То же самое происходит, если вы открываете всплывающее окно для пустого ComboBox, затем связываете большую коллекцию и снова пытаетесь открыть всплывающее окно - до открытия всплывающего окна требуется несколько секунд.
Вот XAML:
<ComboBox Name="cbBlah">
<ComboBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel />
</ItemsPanelTemplate>
</ComboBox.ItemsPanel>
</ComboBox>
и пример кода для привязки, чтобы воспроизвести проблему:
var list = new List<string>();
for (var i = 0; i < new Random().Next(9000, 10000); i++)
list.Add(i.ToString());
cbBlah.ItemsSource = list;
Я попытался сделать так, чтобы панель стека виртуализации выглядела так:
<VirtualizingStackPanel VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Recycling" />
но это не помогает, похоже VirtualizationMode игнорируется, поэтому всплывающее окно открывается очень быстро только в первый раз, а затем, каждый раз после изменения привязки, оно очень медленно.
ОБНОВЛЕНИЕ : я думал о том, чтобы не связывать новую коллекцию каждый раз, а привязать ObservableCollection один раз, а затем просто изменить ее содержимое. То же самое, как только содержимое коллекции изменяется, открытие всплывающего окна все равно занимает несколько секунд: (