ISupportIncrementalLoading не работает, пока я не прокручиваю в GridView
Я реализовал ISupportIncrementalLoading для загрузки большого количества элементов в списке по мере прокрутки пользователем. Когда я загружаю представление, оно пустое и будет загружаться только больше данных, пока я не прокручиваю список.
Это класс, который реализует это
public class DeviceListDataSource<T> : ObservableCollection<T>, ISupportIncrementalLoading
where T : class
{
public int LastItem = 0;
public bool HasMoreItems => hasMoreItems;
private int currentPage;
private List<T> source;
private bool hasMoreItems;
public DeviceListDataSource(List<T> source)
{
this.source = source;
hasMoreItems = true;
}
public async Task<IEnumerable<T>> GetPagedItems(int pageIndex, int pageSize)
{
return await Task.Run(() =>
{
var result = (from p in source
select p).Skip(pageIndex * pageSize).Take(pageSize);
return result;
});
}
public IAsyncOperation<LoadMoreItemsResult> LoadMoreItemsAsync(uint count)
{
var dispatcher = Window.Current.Dispatcher;
return Task.Run(
async () =>
{
var result = await GetPagedItems(currentPage++, (int) count);
if (result == null || result.Count() == 0)
{
hasMoreItems = false;
}
else
{
await dispatcher.RunAsync(
CoreDispatcherPriority.Normal,
() =>
{
foreach (T item in result)
{
Add(item);
}
});
}
return new LoadMoreItemsResult() { Count = (uint)currentPage };
}).AsAsyncOperation();
}
}
}
И в модели представления я назначаю ее переменной, связанной с представлением списка в представлении xaml: Items = new DeviceListDataSource<DataObject>(source);
Есть ли способ загрузить первые элементы X в списке? Его всегда 0, когда он впервые загружается, и он остается таким, пока я не прокручиваю. Большое спасибо!
1 ответ
Есть ли способ загрузить первые элементы X в списке?
Вы уже имели LoadMoreItemsAsync
метод реализован в DeviceListDataSource
класс, просто вызовите этот метод для ручной загрузки кода элементов X при начальной загрузке. Например:
DeviceListDataSource<Data> Items = new DeviceListDataSource<Data>(source);
Items.LoadMoreItemsAsync(10);