繁体   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