Я работаю с WinUI 3 C# и хочу реализовать виртуализацию данных произвольного доступа в ListView. Я понимаю, что эта функция поддерживается по умолчанию, но вместо использования массива в памяти я хочу динамически получать данные из другого источника и отображать только часть за раз.
Я сослался на следующую документацию и реализовал ее. класс, использующий IItemsRangeInfo:
Документация по виртуализации данных с произвольным доступом.
Полоса прокрутки располагается в соответствии с областью отображения, а не размером всей коллекции. Таким образом, после отображения первых пяти элементов данных событие RangesChanged не возникает, и дальнейшие данные загрузить невозможно. Как определяется полоса прокрутки ListView?
C#
public class ObservableRangeCollection : ObservableCollection, IItemsRangeInfo
{
private int _totalCount = 1000;
private int _startIndex;
private int _endIndex;
public int TotalCount
{
get => _totalCount;
set
{
if( _totalCount != value )
{
_totalCount = value;
OnPropertyChanged( new PropertyChangedEventArgs( nameof( TotalCount ) ) );
}
}
}
public override event NotifyCollectionChangedEventHandler CollectionChanged;
public void LoadItems( int startIndex, int count )
{
this.Clear();
// Load Data Simulation
for( int i = startIndex; i < startIndex + count && i < _totalCount; i++ )
{
this.Add( (T)(object)(new SampleData( i )) );
}
OnCollectionChanged( new NotifyCollectionChangedEventArgs( NotifyCollectionChangedAction.Reset ) );
}
public void RangesChanged( ItemIndexRange visibleRange, IReadOnlyList trackedItems )
{
if( visibleRange.FirstIndex != _startIndex && visibleRange.LastIndex != _endIndex )
{
_startIndex = visibleRange.FirstIndex;
_endIndex = visibleRange.LastIndex;
Debug.WriteLine( $"RangeIndex: {_startIndex} , {_endIndex}" );
this.LoadItems( visibleRange.FirstIndex, _endIndex - _startIndex + 1 );
}
}
public void Dispose()
{
throw new NotImplementedException();
}
}
Пользовательский элемент управления C#
public MyUserControl()
{
this.InitializeComponent();
Items = new ObservableRangeCollection();
try
{
Items.LoadItems( 0, 5 );
MyListView.ItemsSource = Items;
}
catch( FormatException ex )
{
}
}
Xaml
Подробнее здесь: https://stackoverflow.com/questions/792 ... determined
Как определяется полоса прокрутки ListView? ⇐ C#
Место общения программистов C#
-
Anonymous
1733998536
Anonymous
Я работаю с WinUI 3 C# и хочу реализовать виртуализацию данных произвольного доступа в ListView. Я понимаю, что эта функция поддерживается по умолчанию, но вместо использования массива в памяти я хочу динамически получать данные из другого источника и отображать только часть за раз.
Я сослался на следующую документацию и реализовал ее. класс, использующий IItemsRangeInfo:
Документация по виртуализации данных с произвольным доступом.
Полоса прокрутки располагается в соответствии с областью отображения, а не размером всей коллекции. Таким образом, после отображения первых пяти элементов данных событие RangesChanged не возникает, и дальнейшие данные загрузить невозможно. Как определяется полоса прокрутки ListView?
C#
public class ObservableRangeCollection : ObservableCollection, IItemsRangeInfo
{
private int _totalCount = 1000;
private int _startIndex;
private int _endIndex;
public int TotalCount
{
get => _totalCount;
set
{
if( _totalCount != value )
{
_totalCount = value;
OnPropertyChanged( new PropertyChangedEventArgs( nameof( TotalCount ) ) );
}
}
}
public override event NotifyCollectionChangedEventHandler CollectionChanged;
public void LoadItems( int startIndex, int count )
{
this.Clear();
// Load Data Simulation
for( int i = startIndex; i < startIndex + count && i < _totalCount; i++ )
{
this.Add( (T)(object)(new SampleData( i )) );
}
OnCollectionChanged( new NotifyCollectionChangedEventArgs( NotifyCollectionChangedAction.Reset ) );
}
public void RangesChanged( ItemIndexRange visibleRange, IReadOnlyList trackedItems )
{
if( visibleRange.FirstIndex != _startIndex && visibleRange.LastIndex != _endIndex )
{
_startIndex = visibleRange.FirstIndex;
_endIndex = visibleRange.LastIndex;
Debug.WriteLine( $"RangeIndex: {_startIndex} , {_endIndex}" );
this.LoadItems( visibleRange.FirstIndex, _endIndex - _startIndex + 1 );
}
}
public void Dispose()
{
throw new NotImplementedException();
}
}
Пользовательский элемент управления C#
public MyUserControl()
{
this.InitializeComponent();
Items = new ObservableRangeCollection();
try
{
Items.LoadItems( 0, 5 );
MyListView.ItemsSource = Items;
}
catch( FormatException ex )
{
}
}
Xaml
Подробнее здесь: [url]https://stackoverflow.com/questions/79274526/how-is-the-scrollbar-of-the-listview-determined[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия