2012-02-23 16 views
1

私はメインストリーム(IEnumerable)に100,000以上のアイテムがあります。そして私は複数のAutoCompleteBoxを私のコントロールに持っています。これらのオートコンプリートボックスはすべてメインストリームにバインドされています。メモリフットプリントの削減

まず:

今の問題は、私は私のコントロールで約10 AutoCompleteBoxを持っており、すべてのため、大容量メモリフットプリントが得られ、そののItemsSourceとしてメインストリームを持っています。

第二:

私はまた、いくつかのイベントに応じて、実行時にいくつかのAutoCompleteBoxさんのItemsSourceにフィルタを適用する機能を持っている必要があります。

このメモリフットプリントを減らし、実行時にフィルタを適用する機能が必要です。

+0

1)あなたはMVVMを使用していますか? 2)MainStreamはリクエスト/レイジーゲッターの項目のリストを返すgetterのproeprtyですか、これは一度に作成されたフィールド/プロパティですか? – sll

答えて

0

メモリフットプリント

私はそれがバインドされたデータソースを使用する方法、それはよくあなたのコードの実装からではなく、AutocompleteControlasからだけではなく、依存と信じています。

  • 項目ようゲッターでyield returnで計算プロパティとして主流の実装が計算される/ AutocompleteControlは、WPFのデータの仮想化を使用するかどうかを確認WPF4について

  • 実行時にオンデマンドで返されました。基本的には、標準アイテムパネルをStackPanelの代わりにVirtualizingStackPanelを使用するように再定義すると、フレームワークはメモリを割り当て、すべてのバインディングではなく目に見えるアイテムに対してのみUIエレメントを作成します。オンザフライ

をフィルタリングMVVMのアプローチを見てみましょう。 MainSTreamアイテムを計算するためにUIフィルタコントロールにバインドされたプロパティを簡単に使用できますが、基本的にgetterはパブリックバウンドプロパティを使用し、それらのいずれかが変更されるとMainSTreamはアイテムを再計算し、INotifyPropertyChangedを介してUIに通知します。 INotifyPropertyChanged。あなたは、メモリの消費量削減にSequential Data Cache

サンプルを探す必要があり、データ収集のメモリフットプリントについて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

を参照してください:

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