代码之家  ›  专栏  ›  技术社区  ›  Ralph Shillington

如何在滚动时填充项源

  •  1
  • Ralph Shillington  · 技术社区  · 14 年前

    当用户在数据网格上滚动时,我想从WCF服务中检索数据。实现这一点有哪些选择,特别是那些希望遵循mvvm模式的选择。

    2 回复  |  直到 14 年前
        1
  •  1
  •   Fares    13 年前

    如果有人还在寻找这个,这里有一种方法可以在Silverlight和MVVM Light中实现它。其他的方法是可能的,比如点击垂直滚动条的位置,但是我相信没有自定义控件在SL中是不可访问的。

    在DataGrid LoadingRow事件中,检查当前行是否接近databound itemssource的底部。然后向ViewModel发送消息以开始获取下一组行。ViewModel中注册的事件将添加到databound属性。

    这是一个简化的代码示例。

    在代码隐藏中:

    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");
      }
    }
    

    在ViewModel中,实现如下内容:

     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中使用Skip()和Take()
    • 防止多个并发服务调用
    • 注意客户端的内存使用,如果列表很大,则处理unladingrow事件以释放内存
    • 我还缺什么
        2
  •  0
  •   Community    7 年前

    我刚刚发布了一些博客文章和一个示例,在用户滚动数据网格时实现了“隐形分页”。我是一个很好的MVVM迷,所以,自然,我的解决方案很适合这种方法。见 this answer 详细情况。