WPF ComboBox通過綁定大型集合來解決性能問題


Answers

我也遇到了性能下降的問題。 但我創建了一個繼承形式為Combobox的類,因此我想以編程方式執行此操作。 所以這裡有其他googlers的解決方案。

ItemsPanel = new ItemsPanelTemplate();
var stackPanelTemplate = new FrameworkElementFactory(typeof (VirtualizingStackPanel));
ItemsPanel.VisualTree = stackPanelTemplate;
Question

我正在嘗試將大型集合綁定到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,然後只是改變它的內容。 同樣的事情,一旦收集內容髮生變化,打開彈出窗口仍需要幾秒鐘:(




Links