Если кто-то все еще ищет это, вот один из способов реализовать это в Silverlight и MVVM Light. Возможны и другие методы, такие как нажатие на положение вертикальной полосы прокрутки, но я считаю, что это невозможно в SL без пользовательского элемента управления.
В событии DataGrid LoadingRow проверьте, находится ли текущая строка близко к нижней части источника элементов с привязкой к данным. Затем отправьте сообщение в 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");
}
}
В 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
}
Дополнительные предметы, которые вы должны кодировать:
- добавить проверку границ
- Если размер вашего чанка слишком мал, вы можете обработать специальный случай начальной загрузки.
- будьте осторожны с нагрузкой, которую он создает на сервере базы данных
- сделайте доступ к вашему веб-сервису эффективным. Например, в Linq используйте Skip () и Take ()
- предотвращение одновременных вызовов нескольких служб
- будьте осторожны с использованием памяти на стороне клиента, обработайте событие UnloadingRow, чтобы освободить память, если ваш список большой
- что-нибудь еще, чего мне не хватает