Проблемы с производительностью WPF ComboBox из-за привязки больших коллекций

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

47
задан Alexey 20 November 2011 в 14:56
поделиться