Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Silverlight 如何在滚动时填充itemssource_Silverlight_Wcf_Mvvm Light - Fatal编程技术网

Silverlight 如何在滚动时填充itemssource

Silverlight 如何在滚动时填充itemssource,silverlight,wcf,mvvm-light,Silverlight,Wcf,Mvvm Light,当用户在数据网格上滚动时,我想从我的WCF服务中检索数据。有哪些选项可以实现这一点,特别是那些有利于遵循mvvm模式的选项。如果有人仍在寻找这一点,下面是在Silverlight和mvvm Light中实现它的一种方法。其他方法也是可能的,比如点击垂直滚动条的位置,但我相信如果没有自定义控件,在SL中是无法访问的 在DataGrid LoadingRow事件中,检查当前行是否接近数据绑定项源的底部。然后向ViewModel发送一条消息,开始提取下一组行。ViewModel中注册的事件将添加到da

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

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

在DataGrid LoadingRow事件中,检查当前行是否接近数据绑定项源的底部。然后向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");
  }
}
您应为其编码的其他项目:

  • 添加边界检查
  • 如果块大小太小,则可能需要处理初始加载特殊情况
  • 小心它在数据库服务器上产生的负载
  • 使您的web服务访问高效。例如,在Linq中使用Skip()和Take()
  • 防止多个并发服务调用
  • 请注意客户端的内存使用,如果列表很大,请处理UnloadingRow事件以释放内存
  • 还有什么我可能遗漏的吗

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

在DataGrid LoadingRow事件中,检查当前行是否接近数据绑定项源的底部。然后向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");
  }
}
您应为其编码的其他项目:

  • 添加边界检查
  • 如果块大小太小,则可能需要处理初始加载特殊情况
  • 小心它在数据库服务器上产生的负载
  • 使您的web服务访问高效。例如,在Linq中使用Skip()和Take()
  • 防止多个并发服务调用
  • 请注意客户端的内存使用,如果列表很大,请处理UnloadingRow事件以释放内存
  • 还有什么我可能遗漏的吗

我刚刚发布了一些博客文章和一个示例,它们在用户滚动数据网格时实现了“隐形分页”。我是一个伟大的MVVM迷,因此,很自然,我的解决方案非常适合这种方法。有关详细信息,请参阅。

我刚刚发布了一些博客文章和一个示例,它们在用户滚动数据网格时实现了“隐形分页”。我是一个伟大的MVVM迷,因此,很自然,我的解决方案非常适合这种方法。有关详细信息,请参阅