2012-11-07 61 views
1

我需要實現無盡的列表框(當用戶滾動到結尾時加載數據塊),我使用ViewModel。ViewModel和無盡的集合

我有列表框綁定到ObservableCollection,但我不知道如何得到有關到達結束的通知,但不打破MVVM範例。 我該如何做到這一點?

我需要知道的唯一事情就是如何保留MVVM的特性和約束,並在集合被枚舉到最後時才能得到通知。

謝謝。

編輯

我一直在周圍挖一點,恐怕這不是一個簡單的解決方案。我認爲唯一的可能性是實現自定義集合,它將實現ICollection和INotifyCollectionChanged。但我不知道ListBox和其他ItemsSource啓用控件的內部機制是如何工作的,所以我不知道如何實現延遲加載。

使用ItemsSource IEnumerable接口的WP控件的主要抓取機制是什麼?或者它使用索引器方法?它是如何算數的?它取決於計數還是可以在生命週期中更改(以及哪些呼叫?我認爲並非所有呼叫都可以更改計數然後調用NotifyCollectionChanged)。

有沒有文件?或者有沒有可用的實現?

+0

我懷疑你的集合在你填充ListBox的時候會盡快結束,你應該找的是一個ListBox事件,當它(幾乎)到達列表的末尾。 –

+0

+1。我也對這樣的解決方案感興趣。 – Jehof

回答

2

因爲這應該支持MVVM,所以我不會將事件綁定到列表框的一部分,而是作爲集合本身的一部分。 當請求的索引接近列表末尾時,您應該嘗試添加更多塊。

達到此目的的一種方法是繼承IList並監視this[int index]屬性。

例如:

public class OC<T> : IList<T>, IList 
{ 
    public T this[int index] 
    { 
     get 
     { 
      if (index >= (this.Count - 20)) // Insert correct heuristics here! 
      { 
       // Load more chunks 
      } 
      return base[index]; 
     } 
    } 
} 

(當然Count - 20的是做到這一點的最好方式,你可能想輸入自己的啓發式(也許如果該指數在過去的10% ),但它顯示了這個概念)

這樣,你不關心如果視圖使用列表框或組合或任何 - 你保持MVVM模式。當要求的當前項目是一個項目的列表末尾,這是你的隊列開始加載更多的塊...

請注意,你也想從IList派生自太虛擬化,WPF似乎檢查一個IList(沒有泛型)和IList<T>不是從IList派生。長話短說,如果你不是從IList 也得到,索引器將被稱爲列表中的每個項目。

+0

這不起作用,因爲這並不是重寫索引器,而是隱藏索引器。它通過反射來訪問,不會覆蓋它。或者我錯了? –

+0

@MartinMacak您正確地繼承了ObserverableCollection而不是IList(在答案中更新了BTW),如果您使用反射,會導致問題。 。可悲的是,ObservableCollection不會讓你覆蓋該屬性。我們也有同樣的擔憂。我們發現這在大多數情況下都不是問題,而在特定的投影中,它是一個問題,我們決定創建我們自己的專有「可觀察」集合,它也實現了上述邏輯(ObservableCollection的原始代碼是廣泛可用的BTW)。 – Blachshma

+0

我嘗試了一些東西,恐怕不能這樣做。觀察結果是:ListBox不是用戶枚舉器(這是合乎邏輯的,因爲它不支持查找/跳過)。但!!!每個項目都會調用索引器,而不僅僅是那些當前顯示的索引器。這種方法將所有塊加載到一行中,但如果不監聽組件的滾動事件,這將不起作用。 –

相關問題