2011-07-11 33 views
0

我有一個類繼承自ItemsControl,也是一個從VirtualizedStack Panel繼承的VirtualizedPanel,我創建了模板,以便我的控件在ScrollViewer內部保存ItemsPresenter並擁有所有啓用Vitualizing屬性以及CanContentScroll。即使啓用了虛擬化,WPF中的ItemsControl也會生成所有項目

問題是我在後端使用DataVirtualization,所以我沒有內存中的所有集合,並且在WPF中當ItemsControl被加載時它調用GetEnumerator(),所以它試圖遍歷整個採集。在Silverlight中,這不會發生,ItemsControl只需使用實現IList的我的Collection的Indexer調用可見項。

有沒有辦法讓WPF中的ItemsControl只使用索引器,而不是試圖通過IEnumerable加載所有的集合?

+0

你有沒有樂在這裏:http://bea.stollnitz.com/blog/?p=344?或多或少在2年前,我正在與WPF合作,並使用這篇文章中的一些技術,這非常好。 – Tigran

回答

1

虛擬化默認情況下只在WPF應用到列表框和ListView ....嘗試使用這些控件的一個...

+0

我碰到過使用itemsControl,因爲ListBox選擇不能很好地處理Data Virtualized Collection,當滾動它時會感到困惑,因爲數據是虛擬化的,所以它不能通過比較Items來保留選擇。 – 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(); 
     } 
    ... 
} 
相關問題