Я пытаюсь привязать большую коллекцию к 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 один раз, а затем просто изменять ее содержимое. То же самое, как только меняется содержимое коллекции, открытие всплывающего окна все равно занимает несколько секунд: (