2016-06-08 4 views
0

У меня проблема с производительностью, которую я только что решил, но я действительно не понимаю, почему решение работает.Странная проблема с производительностью с привязкой WPF ComboBox

У меня есть ComboBox, содержащий около 4000 элементов, которые я связываю с коллекцией, используя свойство ItemSource; если я привяжусь к свойству в модели вида с помощью getter и setter, все работает нормально, но если я привяжусь к свойству только с помощью getter, то в первый раз, когда я нажимаю на combobox, он отлично работает, но каждый раз после первого время, если я нажимаю на выпадающий список приложение висит около 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); 
    ... 
} 
... 

View-model, который вызывает применение га нг:

... 
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 из вида-модели инициализирует коллекцию, которая переплетена в выпадающий список, и этот метод вызывается только один раз вскоре после того, как вид и вид-модель создаются. После этого коллекция не изменяется

Знает ли кто-нибудь, что вызывает это странное поведение?

ответ

0

Я думаю, что это касается List.AddRange(), а не свойства.

Если новый граф (текущий граф плюс размер коллекции) будет больше, чем емкость, емкость списка увеличивается автоматически перераспределить внутренний массив для размещения новых элементов, а также существующие элементы копируются в новый массив до добавления новых элементов.

msdn

Смежные вопросы