Я бы попробовал комбинацию ленивой загрузки и асинхронной загрузки:
Используйте виртуальный список управления. Создайте ViewModel для ваших элементов и заполните свой список экземплярами ViewModel (по одному на строку).
В вашей ViewModel создайте свойства со значением по умолчанию, которое показывает пользователю, что данные не были загружены. При первом обращении к одному из этих свойств запускается загрузка данных асинхронно и запускается INotifyPropertyChanged
при получении реальных данных.
Это даст пользователю хороший опыт, и большая часть хитрой работы будет выполнена через список виртуализации (в WPF это ListBox
, ListView
, DataGrid
...). Надеюсь, это помогло.
class LineItemVM : INotifyPropertyChanged{
bool m_loadingTriggered;
string m_name="Loading...";
string m_anotherProperty="Loading...";
public string Name{
get{
TriggerLoadIfNecessary(); // Checks if data must be loaded
return m_name;
}
}
public string AnotherProperty{
get{
TriggerLoadIfNecessary(); // Checks if data must be loaded
return m_anotherProperty;
}
}
void TriggerLoadIfNecessary(){
if(!m_loadingTriggered){
m_loadingTriggered=true;
// This block will called before your item will be displayed
// Due to the m_loadingTriggered-member it is called only once.
// Start here the asynchronous loading of the data
// In virtualizing lists, this block is only called if the item
// will be visible to the user (he scrolls to this item)
LoadAsync();
}
}
...
Дополнительная логика
В качестве идеи вы могли бы также создать внешний асинхронный поток загрузки, который загружает все данные в фоновом режиме, но имеет список элементов, которые должны быть загружены с более высоким приоритетом. Концепция такая же, как в приведенном выше примере, но вместо загрузки данных из элемента ViewModel метод TriggerLoadIfNecessary
добавляет только элемент в список с высоким приоритетом, так что потенциально видимые элементы загружаются первыми. Вопрос о том, какая версия лучше подходит, зависит от использования списка. Если существует вероятность того, что пользователь использует полный список и не будет быстро перемещаться, эта расширенная версия лучше. В противном случае оригинальная версия, вероятно, лучше.