2010-10-20 30 views

回答

1

如果有人仍在尋找這個,這裏有一種方法可以在Silverlight和MVVM Light中實現它。其他方法也是可能的,比如點擊垂直滾動條的位置,但是我相信在沒有自定義控件的情況下SL是無法訪問的。

在DataGrid LoadingRow事件中,檢查當前行是否接近數據綁定itemssource的底部。然後向ViewModel發送消息以開始獲取下一組行。 ViewModel中的註冊事件添加到數據綁定屬性中。

這是一個簡化的代碼示例。

在後面的代碼:

void dg_LoadingRow(object sender, DataGridRowEventArgs e) 
{ 
    ObservableCollection<YourDataType> list = dg.ItemsSource as ObservableCollection<YourDataType>; 
    int idx = list.IndexOf((YourDataType)e.Row.DataContext); 
    if ((list.Count() - idx) == 5) //start fetching when loading 5th from bottom of current list 
    { 
    Messenger.Default.Send(null, "fetchdatatoken"); 
    } 
} 

在視圖模型,實現這樣的事情:

Messenger.Default.Register(this, "fetchdatatoken",() => 
{ 
    var returnedList = webservice.getdata(chunkNumber, chunkSize, "any additional parameters you need for your query") 
    yourListProperty.AddRange(returnedList); //yourListProperty is the databound ObservableCollection property  
} 

其他項目,你應該代碼:添加界限

  • 檢查
  • 如果你的塊大小太小,那麼你可能想要交易初始加載特殊情況。
  • 請注意它在數據庫服務器上產生的負載
  • 使您的Web服務訪問效率更高。例如,在LINQ的使用跳過()和Take()
  • 防止多個併發的服務調用
  • 小心在客戶端的內存使用,處理UnloadingRow事件以釋放內存,如果你的列表是大
  • 什麼否則我可能會丟失
0

我剛剛發表了一些博客文章和樣本,而用戶通過一個DataGrid滾動它們實現「隱形分頁」。我是一個偉大的MVVM粉絲,所以,我的解決方案當然適合這種方法。有關詳細信息,請參見this answer