2012-02-23 2 views
1

У меня есть Основной поток (IEnumerable) с более чем 100 000 предметов. А потом у меня есть несколько AutoCompleteBox. Все эти автокомпьютеры привязаны к основному потоку.Сокращение объема памяти

Первое:

Теперь проблема у меня есть около 10 AutoCompleteBox в моем контроле, и все, имеющее основной поток, так как при их ItemsSource в результате большой объем памяти.

Второе:

Мне также нужно иметь функциональные возможности для применения фильтров на ItemsSource немногих AutoCompleteBox во время выполнения в зависимости от некоторых событий.

Мне нужны ваши предложения по уменьшению объема памяти и функциональность применения фильтров во время выполнения.

+0

1) Вы используете MVVM? 2) Does MainStream является proeprty с getter, который возвращает список элементов по запросу/lazy getter, или это одно заселенное поле/свойство? – sll

ответ

0

след памяти

Я считаю, что это зависит не только от вашей реализации коды, но из AutocompleteControlas хорошо, как он использует связанный источник данных.

  • Реализовать Mainstream, рассчитываемые недвижимости с yield return в поглотителе так, пункты будут вычисленной/возвращается по требованию во время выполнения

  • Для WPF4 ли с помощью AutocompleteControl WPF виртуализации данных. В принципе, вы можете переопределить панель стандартных элементов, чтобы использовать VirtualizingStackPanel вместо StackPanel, поэтому инфраструктура будет выделять память и создавать элементы пользовательского интерфейса только для видимых элементов, а не для всех связанных.

На лету фильтрации

Взгляните на подходе MVVM. Было бы легко использовать свойства, привязанные к элементу управления фильтром UI, чтобы вычислять элементы MainSTream, в основном геттер использовал бы общие связанные свойства и каждый раз, когда любой из них был изменен - ​​MainSTream пересчитывал элементы и уведомлял пользовательский интерфейс через INotifyPropertyChanged, очевидно, вам нужно реализовать поддержку INotifyPropertyChanged. См One sentence explanation to MVVM in WPF?

public IEnumerable<IMyItem> MainStream 
{ 
    get 
    { 
     foreach(var item in mainDataSource) 
     { 
     if (item.Name == this.NameFilterBoundToUiTextBox) 
     { 
      yield return item; 
     } 
     } 
    } 
} 

private string nameFilter; 
public string NameFilterBoundToUiTextBox 
{ 
    get 
    { 
     return this.nameFilter; 
    } 
    set 
    { 
     if (this.nameFilter != value) 
     { 
     this.nameFilter = value; 

     // TODO: Implement INotifyPropertyChanged 
     this.OnPropertyChanged("NameFilterBoundToUiTextBox"); 

     // THis would notify UI to rebind MainSream 
     this.OnPropertyChanged("MainStream"); 
     } 
    } 
} 
0

Для следа памяти сбора данных следует искать Sequential Data Cache

образца, чтобы уменьшить потребление памяти:

public void TestAutoCompleteLookup() 
    { 
     var path = ""; 
     using (var c = SequentialDataCache<AutoCompleteItem>.Initialize()) 
     { 
      path = c.Path; 

      //add 100.000 items 
      for (int i = 0; i < 100000; i++) 
      { 
       c.Add(new AutoCompleteItem() { Text = string.Format("{0}Text", i) }); 
      } 

      //query 
      var pattern = "1"; 
      var items = c.Where(autoCompleteItem => autoCompleteItem.Text.StartsWith(pattern)).ToArray(); 

     } 

     if (File.Exists(path)) 
      File.Delete(path); 
    } 

    [Serializable] 
    private class AutoCompleteItem 
    { 
     public string Text { get; set; } 
    } 
Смежные вопросы