Сохранить позицию прокрутки с помощью виртуализированной сетки данных - PullRequest
0 голосов
/ 31 мая 2018

У меня маленькая проблема.У меня есть сетка данных, которая отображает много строк.Поэтому для повышения производительности я решил виртуализировать свою сетку данных.До этого проблем нет.Теперь я хотел бы сохранить положение прокрутки после обновления.

Несмотря на некоторые исследования, я не нашел решения.Сейчас это мой код, но он не работает:

 <DataGrid x:Name="Test" AutoGenerateColumns="False" ItemsSource="{Binding ItemCollection}" SelectionMode="Single"  IsReadOnly="True"
                         CanUserAddRows="False" CanUserDeleteRows="False" CanUserReorderColumns="False" CanUserResizeColumns="False"
                         SelectedItem="{Binding SelectedItem, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
                         VirtualizingPanel.IsVirtualizingWhenGrouping="True" VirtualizingPanel.IsContainerVirtualizable="True"
                         VirtualizingPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Recycling" Grid.Row="1"
                         ScrollViewer.CanContentScroll="True" ScrollViewer.HorizontalScrollBarVisibility="Disabled">

В моей ViewModel я обновляю свою сетку данных следующим образом:

public ICollectionView ItemCollection
{
    get
    {
        return _itemCollection;
    }
    set
    {
        _itemCollection= value;
        OnPropertyChanged(() => ItemCollection);
    }
} 

И это моя функция, которая обновляетколлекция данных:

var orderCollection = Items.OrderByDescending(item => item.BeginDate);

var itemCollection = CollectionViewSource.GetDefaultView(orderCollection);
itemCollection.GroupDescriptions.Clear();

using (itemCollection.DeferRefresh())
{
    itemCollection.GroupDescriptions.Add(new PropertyGroupDescription("ShortStartDate"));
    itemCollection.Filter = ApplyFilter;
}

ItemCollection = itemCollection;

И это, мой код позади.GetScrollPosition вызывается непосредственно перед вызовом метода выше.И SetScrollPosition - это вызов сразу после.

private void GetScrollPosition()
{
    if (DayBooks != null)
    {
        var scrollViewer = GetScrollViewer(DayBooks);
        if (scrollViewer != null)
            _currentScrollPosition = scrollViewer.VerticalOffset;
    }
}

public void SetScrollPosition()
{
    if (Test != null)
    {
        var scrollViewer = GetScrollViewer(Test);
        if (scrollViewer != null)
        {
            if (_currentScrollPosition != 0)
            {
                scrollViewer.InvalidateScrollInfo();
                scrollViewer.ScrollToVerticalOffset(_currentScrollPosition);
            }
        }
    }
}

private ScrollViewer GetScrollViewer(UIElement element)
{
    if (element == null) return null;

    ScrollViewer retour = null;
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(element) && retour == null; i++)
    {
        if (VisualTreeHelper.GetChild(element, i) is ScrollViewer)
        {
            retour = (ScrollViewer)(VisualTreeHelper.GetChild(element, i));
        }
        else
        {
            retour = GetScrollViewer(VisualTreeHelper.GetChild(element, i) as UIElement);
        }
    }
    return retour;
}

Итак, когда моя сетка данных обновляется, я пытался установить свою позицию прокрутки (_currentScrollPosition), но позиция осталась равной 0, и я потерял свою позицию.

Возможно ли решить мою проблему и сохранить процесс виртуализации?

1 Ответ

0 голосов
/ 02 июня 2018

Ваша проблема обычно решается с помощью прокрутки в представлении поведения, которое реагирует на выбранный элемент вместо определенной позиции прокрутки: ScrollIntoView для WPF DataGrid (MVVM)

Рассматривали ли выиспользовать такое поведение для реализации поведения, которое вы ищете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...