2012-06-25 2 views
4

У меня есть форма WPF, которая содержит сетку 30x30, где каждая ячейка сетки является ComboBox. Значения ComboBox и выбранное значение привязаны от DataContext. Проблема в том, что он идет очень медленно. Я переработал форму так, чтобы она отображала текстовые поля вместо comboboxes (и TextBox конвертировалась в ComboBox на ввод мыши), и теперь она работает мгновенно.1000 combobox binding

Почему ComboBoxes так медленнее? Есть ли способы улучшить массивную привязку ComboBox?

+2

Использовали ли вы виртуализованные ComboBoxes? (Например, см. Статью [Виртуализация пользовательского интерфейса] (http://bea.stollnitz.com/blog/?p=338)). –

ответ

5

ComboBox не использует виртуализацию (VirtualizingStackPanel) по умолчанию, вы можете изменить панель, используемую элементом управления в очень простым способом:

<ComboBox ItemsSource="{Binding}"> 
    <ComboBox.ItemsPanel> 
     <ItemsPanelTemplate> 
      <VirtualizingStackPanel /> 
     </ItemsPanelTemplate> 
    </ComboBox.ItemsPanel> 
</ComboBox> 

Ref: Improving Combobox Performance through UI Virtualization

Это очень помогает в улучшив производительность, если у ComboBox есть тысячи предметов, не уверен, насколько полезно будет в вашем случае иметь 1000 comboboxes для пользовательского интерфейса.

Вы также можете попробовать поместить эти comboBoxes в виртуализованную панель (например, ListBox или напрямую используя VirtualizedStackpanel).

Еще одна вещь, которую вы можете попробовать - это сделать ваши привязки асинхронными ComboBoxItemSource, используя свойство IsAsync.

Надеюсь, вы используете ObservableCollection как ваш ItemSource;