2011-09-28 47 views
3

我有一個列表框,可以潛在地具有大量的與背襯的數據項目。爲了處理數據虛擬化,我通過編寫一個實現與ObservableCollection相同的接口的集合來綁定到WPF的UI虛擬化中,並且可以根據需要創建我們的後備數據。列表框數據虛擬化和多選

這工作正常。當我在列表框中引入多選時,問題就出現了。由於列表框通過對象而不是索引管理選定的項目(SelectedItems),所以選擇所有項目會導致所有的後臺數據被啓動並保存在內存中,從而破壞數據虛擬化...

Is there一種防止發生這種情況的方法,除了重寫ListBox來管理通過索引而不是對象進行選擇?

謝謝!

Eric

+0

這聽起來像你得到了你想要的到底是什麼,因爲你想要的物品按需加載。爲了「全選」你需要加載它們,對吧? TBH,我會覆蓋列表框的CTRL-A(全選),並將其綁定到一個不做任何事情的命令(基本上禁用它)。無論你是否可以通過綁定來完成此操作,或者如果您需要派生列表框的子類,我都不確定。 –

+0

不完全。我只希望實際上可見的項目加載數據,但我希望列表框能夠保持選定的索引列表,即使項目不在屏幕上,以便在可見時選擇該項目。我希望允許用戶使用ctrl-a,我不想阻止他們選擇所有項目。 – esc861

+0

對不起,我沒有訪問代碼發佈權利,但我有類似的情況,我做了什麼是移動到ListView(但我認爲你可以用ListBox做到這一點)單選和使用與CheckBox模板。這樣您就可以在項目級別處理檢查(選擇),而不需要ListBox管理選定項目的集合。我這樣做是爲了更好地控制處理Check事件,但我懷疑它也適用於虛擬化。使用UpdateSourceTrigger = PropertyChanged與LostFocus事件一樣,您可能會遇到ListItem消失的問題。 – Paparazzi

回答

0

我們使用虛擬化的用戶界面來控制我們的數據虛擬化,但都具有列表框抓着選擇,所以我們的數據沒有被卸載的問題。

我最終什麼事做了tieing到項目生成的虛擬化堆棧面板和聽數據上下文改變事件所產生的容器。發生這種情況時,我要麼從包裝器中卸載真實數據。

0

爲什麼不使用UI控件上的Virtualizing選項?這隻會加載要顯示在屏幕上的數據。

http://www.kirupa.com/net/ui_virtualization_pg1.htm

+0

這種方法能夠多選擇很多條目,比如70K? – Wolf

+0

我甚至不知道爲什麼/如何一次UI想要選擇多個條目。但是,我不明白爲什麼它無法處理它。您可以通過UI手動選擇條目(永久保存)或通過代碼調用。虛擬化僅適用於在屏幕上顯示控件 - 而不是控件本身/內存中的備份數據。 – tsells

+0

好吧,我只是試了一百萬個項目(簡單地使用索引作爲數據文本)。選擇全部([Home],然後[Shift] [Ctrl] [End])工作得非常快。順便說一句:我使用虛擬化列表框來顯示日誌文件的內容。現在,用戶應該能夠將其部分複製到剪貼板。 – Wolf