2016-06-08 77 views
0

我有一个性能问题,我刚刚解决,但我真的不明白为什么解决方案的作品。与WPF组合框绑定奇怪的性能问题

我有一个ComboBox约4,000个项目,我使用ItemSource属性绑定到集合;如果我使用getter和setter绑定到视图模型中的属性,一切正常,但是如果我仅使用getter绑定属性,第一次单击组合框时它可以正常工作,但每次在第一次之后的时间,如果我点击应用程序挂起与〜100%的CPU为过程约1分钟显示组合框项目

查看之前的组合框:

... 
<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); 
    ... 
} 
... 

视图模型导致应用程序NG:

... 
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

我认为这是关于List.AddRange()而不是属性。

如果新计数(当前计数加上集合的大小)将大于容量,则通过自动重新分配内部数组以适应新元素和现有元素来增加列表的容量在新元素添加之前被复制到新数组中。

msdn