Я работаю с 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 ... -virtualiz
Как настроить размер полосы прокрутки для общего количества элементов в виртуализации данных произвольного доступа с пом ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Fastapi и vue интегрируют полосы платежей, могу ли я отказаться от элементов полосы?
Anonymous » » в форуме Python - 0 Ответы
- 31 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Fastapi и vue интегрируют полосы платежей, могу ли я отказаться от элементов полосы?
Anonymous » » в форуме Python - 0 Ответы
- 46 Просмотры
-
Последнее сообщение Anonymous
-