ItemsControl, загружающий элементы один за другим асинхронно

Я создаю собственный DataGrid, производя традиционный WPF DataGrid на основе takeit. Я хочу, чтобы функциональность в сетке загружала элементы один за другим асинхронно, при этом, как только ItemsSource изменяется, т.е. новая коллекция устанавливается в свойство ItemsSource или связанная коллекция изменяется из-за элементов, которые были добавлены, перемещены или удалены (при этом уведомления поступают в сетку данных, когда базовый источник реализует INotifyCollectionChanged, например ObservableCollection).

Это связано с тем, что даже при виртуализации панели стека под сеткой данных требуется время для загрузки (задержка 2-3 секунды) для загрузки строк данных, когда она имеет несколько столбцов, а некоторые из них основаны на шаблонах. При вышеописанном поведении эта задержка «кажется» уменьшенной, что дает сетке данных ощущение, что у нее есть данные и что она достаточно отзывчива, чтобы загрузить их.

Как я могу достичь этого?

Спасибо Винит.


person Vinit Sankhe    schedule 06.05.2010    source источник


Ответы (1)


Похоже, вы ищете data virtualization', что обычно означает создание собственного пользовательского типа, похожего на IList, и проделывание большой работы по гидратации объектов постфактум.

В конечном итоге ваши данные, отображаемые в сетке, будут выглядеть примерно так:

Index 0: new MyDataObject(0);
Index 1: new MyDataObject(1);

И MyDataObject реализует INotifyPropertyChanged.

В конструкторе вы выполняете логику, необходимую для определения времени, расписания или интерпретации, когда должны быть прочитаны реальные результаты. До тех пор вы возвращаете довольно пустые данные... null и string.Empty из ваших свойств.

Затем, как только данные станут доступными (в идеале в фоновом потоке, читаемом откуда угодно — ваши собственные локальные данные, база данных или веб-служба), вы можете обновить реальные базовые значения свойств и запустить уведомления об изменении свойств, чтобы пользовательский интерфейс тогда правильно загружается.

Это слишком сложно, чтобы просто прыгнуть, поэтому поиск поможет. Надеюсь, это поможет вам начать.

person Jeff Wilcox    schedule 11.05.2010