как заполнить источник предметов при прокрутке - PullRequest
1 голос
/ 20 октября 2010

Я хотел бы получить данные из моей службы WCF, когда пользователь прокручивает сетку данных. Какие есть варианты для достижения этой цели, особенно те, которые предпочтут следовать шаблону mvvm.

Ответы [ 2 ]

1 голос
/ 07 декабря 2011

Если кто-то все еще ищет это, вот один из способов реализовать это в 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, чтобы освободить память, если ваш список большой
  • что-нибудь еще, чего мне не хватает
0 голосов
/ 13 августа 2012

Я только что опубликовал несколько постов в блоге и пример, в котором реализована «скрытая подкачка», пока пользователь просматривает Datagrid. Я большой поклонник MVVM, поэтому, естественно, мое решение хорошо подходит для такого подхода. Подробнее см. этот ответ .

...