2011-07-11 12 views
0

ItemsControlから継承するクラスとVirtualizedStack Panelを継承するVirtualizedPanelを持っています。 Vitualizing PropertiesとCanContentScrollが有効になっています。WPFのItemsControlは、仮想化が有効になっていてもすべてのアイテムを生成します

問題は、DataVirtualizationをバックエンドで使用しているため、ItemsControlがロードされてGetEnumerator()が呼び出されたときにメモリとWPFにすべてのコレクションが含まれていないためです。コレクション。 Silverlightでは、これは起こっていません、ItemsControlはIListを実装しているMy CollectionのIndexerを使って可視アイテムを呼び出すだけです。

WPFでItemsControlを作成してIEnumerableですべてのコレクションをロードするのではなく、インデクサーを使用する方法はありますか?

+0

はあなたがここにいました洛:http://bea.stollnitz.com/blog/?p=344?多かれ少なかれ2年前、私はWPFで作業していて、本当に良いこの記事のsometechncsを使用しました。 – Tigran

答えて

1

仮想化だけ....これらのコントロールのいずれかを使用して試してみるWPFではデフォルトでListBoxコントロールとListViewコントロールに適用される...

+0

データが仮想化されているためアイテムを比較して選択を保持できないため、スクロールすると混乱してしまうので、ListBoxの選択がData Virtualized Collectionでうまく動作しないためitemsControlを使用しました。 – jmayor

+0

WPFではListViewから継承しなければならず、それでもIEnumerableを使用しようとしますが、最初の項目のみを要求します。 #defineを作成してSL上でItemsControlを継承するようにしなければなりませんでした。それはWPFでListViewから継承し、ListViewで選択を処理させます。 – jmayor

1

私のためにカスタムコレクションを実装しようとしていたとき、私は同じ問題を抱えていましたコントロール、ItemsControlから継承されます。私のコレクションはIListだけを実装し、ItemsSourceに置いたときにインデクサーを除いてGetEnumeratorメソッドが呼び出されました。私がIListから継承を追加したら、インデクサーを呼び出し始めます。使い方の

例:

class MyClass : IList<T>, IList 
{ 
    ... 
     object IList.this[int index] 
     { 
      get { return this[index]; } 
      set { throw new NotSupportedException(); } 
     } 

     public int this[int index] 
     { 
      get { return items[i]; } 
      set { throw new NotSupportedException(); } 
     } 

     public IEnumerator<T> GetEnumerator() 
     { 
      for (int i = 0; i < count; i++) 
      { 
       yield return items[i]; 
      } 
     } 

     IEnumerator IEnumerable.GetEnumerator() 
     { 
      return GetEnumerator(); 
     } 
    ... 
} 
関連する問題