我遇到了一个我刚解决的性能问题,但我真的不明白为什么解决方案有效。
我有一个ComboBox,大约有4,000个项目,我使用ItemSource属性绑定到一个集合;如果我使用getter和setter绑定到视图模型中的属性一切正常,但如果我绑定到只有一个getter的属性,我第一次点击组合框它工作正常,但每次在第一次之后时间如果我点击组合框,应用程序在显示组合框项目之前,CPU处理过程大约持续1分钟~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));
...
}
...
视图模型的初始化方法初始化绑定到组合框的集合,并且在创建视图和视图模型后不久只调用此方法一次。之后,集合不会改变
有人知道造成这种奇怪行为的原因吗?
答案 0 :(得分:0)
我认为这是关于List.AddRange()而不是属性。
如果新Count(当前Count加上集合的大小)将大于Capacity,则通过自动重新分配内部数组以容纳新元素来增加List的容量,并将现有元素复制到添加新元素之前的新数组。