簡體   English   中英

WPF ComboBox綁定的奇怪性能問題

[英]Strange performance issue with WPF ComboBox binding

我剛剛解決了一個性能問題,但我真的不明白為什么該解決方案有效。

我有一個包含約4,000個項目的ComboBox,我使用ItemSource屬性將其綁定到集合; 如果我使用getter和setter綁定到視圖模型中的屬性,則一切正常,但是如果我僅使用getter綁定到屬​​性,則第一次單擊組合框時,它會正常運行,但是每次之后時間,如果我單擊組合框,則在顯示組合框項目之前,應用程序掛起約1分鍾,進程的CPU占用率約為100%

視圖:

...
<ComboBox
    Grid.Column="1"
    ItemsSource="{Binding AvailableDispositionCodes}"
    DisplayMemberPath="DisplayName"
    SelectedItem="{Binding SelectedDispositionCode}"
    Width="Auto"
    Height="25"
    Margin="5 0 0 0">
    <ComboBox.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel />
        </ItemsPanelTemplate>
    </ComboBox.ItemsPanel>
</ComboBox>
...

工作視圖模型:

...
private IEnumerable<DispositionCodeViewModel> availableDispositionCodes = new List<DispositionCodeViewModel>();
...
public IEnumerable<DispositionCodeViewModel> AvailableDispositionCodes
{
    get
    {
        return this.availableDispositionCodes;
    }

    set
    {
        this.availableDispositionCodes = value;
        this.OnPropertyChanged();
    }
}
...
public void Initialize()
{
    ...
    this.AvailableDispositionCodes = resultCodeViewModels.OrderBy(x => x.Name);
    ...
}
...

導致應用程序掛起的視圖模型:

...
private List<DispositionCodeViewModel> availableDispositionCodes = new List<DispositionCodeViewModel>();
...
public IEnumerable<DispositionCodeViewModel> AvailableDispositionCodes
{
    get { return this.availableDispositionCodes; }
}
...
public void Initialize()
{
    ...
    this.availableDispositionCodes.AddRange(resultCodeViewModels.OrderBy(x => x.Name));
    this.OnPropertyChanged(nameof(this.AvailableDispositionCodes));
    ...
}
...

視圖模型的Initialize方法初始化綁定到組合框的集合,並且在創建視圖和視圖模型之后不久,將立即調用此方法一次。 之后,收藏不會改變

有人知道導致這種奇怪行為的原因嗎?

我認為這是關於List.AddRange()而不是屬性。

如果新的Count(當前Count加上集合的大小)將大於Capacity,則通過自動重新分配內部數組來容納新元素來增加List的容量,並將現有元素復制到新數組中在添加新元素之前。

msdn

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM