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