Я работаю с WinUI 3 C# и хочу реализовать виртуализацию данных произвольного доступа в ListView. Я понимаю, что эта функция поддерживается по умолчанию, но вместо использования массива в памяти я хочу динамически получать данные из другого источника и отображать только часть за раз.
Я сослался на следующую документацию и реализовал ее. класс, использующий IItemsRangeInfo:
Документация по виртуализации данных с произвольным доступом.
Вопрос. Я хотел бы установить общий размер полос прокрутки равным 10000, но в конечном итоге они меняют размер в соответствии с фактическим отображением. В документации указано, что это будет общий размер, но что, если я хочу, чтобы полосы прокрутки имели общий размер при виртуализации с помощью ListView?
C#
public class ObservableRangeCollection : ObservableCollection, IItemsRangeInfo
{
private int _totalCount = 10000;
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#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Полоса прокрутки без фиксированной высоты/Динамическая высота с полосой прокрутки
Anonymous » » в форуме CSS - 0 Ответы
- 53 Просмотры
-
Последнее сообщение Anonymous
-