Как настроить размер полосы прокрутки для общего количества элементов в виртуализации данных произвольного доступа с помC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как настроить размер полосы прокрутки для общего количества элементов в виртуализации данных произвольного доступа с пом

Сообщение 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












Подробнее здесь: https://stackoverflow.com/questions/792 ... -virtualiz
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»