2011-11-23 37 views
0

我有我自己的DefferedList:IList類。我推翻爲什麼虛擬化列表框請求舊項目

計數,的IndexOf,此[]

成員和放

的Debug.WriteLine( 「獲取」 +指數);

進入此[int index]。

然後我將這個類的實例綁定到ListBox.ItemSource。

一切都很好,但UI虛擬化對我來說有點奇怪。我運行應用程序。列表框由前17個項目(從0到17)填充。然後我跳到第200項

TheList.ScrollIntoView(Item200); 

ListBox請求第200個項目,然後再次項目從0到16,最後是184-209。

那麼爲什麼它再次要求0-16項目,而他們不再可見?它非常嚴重地影響了我的數據虛擬化的性能。

如何避免它?

+0

您提供的代碼鏈接有點複雜,難以理解......您是否與代碼所有者協商過? –

+0

你設置了'VirtualizationMode = Recycling'嗎?順便說一句,你如何知道哪些項目在滾動時被請求? – sll

+0

我讓我的問題更清楚一點。更改VirtualizationMode沒有幫助 – Pashec

回答

0

對於使用標準ListBox中使用的列表的自定義虛擬化,我有一些非常糟糕的經歷,浪費了生產力。我建議不要使用自定義列表,而應使用ObservableCollection。我認爲ListBox可能主要是通過ObservableCollection進行測試的,爲避免填充整個列表,您嘗試製作的任何技巧都可能會適得其反,因爲ListBox不像您期望的那樣靈活,基於ItemsSource只是一個IEnumerable。實際上,基於這種期望 - 如果要顯示項目200,您可以假設它需要枚舉介於0和200之間的所有項目。

如果列表中有幾百個項目 - 您可能想要簡化數據模型來顯示它們,所以你從一開始就用所有項目填充一個ObservableCollection,並且只在項目內容被請求並且不可用時才加載項目數據。如果這太多了 - 您可以在加載數據之前添加一個小的延遲,並在開始加載之前檢查收集項目視圖是否在屏幕上可見之後。

如果你的ItemTemplate具有預定義的尺寸,那麼應該有幫助的另一件事。

+0

不,虛擬化ListBox不會枚舉從0到200的項目,如果我請求200。我的測試顯示了它。我試過INotifyCollectionChanged,但行爲是一樣的。看起來不管你有什麼作爲底層存儲(IList,ObservableCollection或INotifyCollectionChanged) – Pashec