2010-10-20 52 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