У меня маленькая проблема.У меня есть сетка данных, которая отображает много строк.Поэтому для повышения производительности я решил виртуализировать свою сетку данных.До этого проблем нет.Теперь я хотел бы сохранить положение прокрутки после обновления.
Несмотря на некоторые исследования, я не нашел решения.Сейчас это мой код, но он не работает:
<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, и я потерял свою позицию.
Возможно ли решить мою проблему и сохранить процесс виртуализации?