Когда PageUp / PageDown использует сетку данных — как работает ICollectionView?

#c# #.net #wpf #datagrid #wpfdatagrid

#c# #.net #wpf #datagrid #wpfdatagrid

Вопрос:

Мне нужно решить сложную задачу. При использовании сетки данных WPF подкачка работает нормально, пока у вас нет никаких группировок.

Однако, как только появляются группировки, это становится немного сложнее. На самом деле pageup / down больше не работают корректно.

Один из найденных мной обходных путей — получить доступ к внутреннему просмотрщику прокрутки, который является оболочкой внутри сетки данных, используя это:

вспомогательный класс:

 public static class VisualTreeUtilities
    {
        public static T GetVisualChild<T>(Visual parent) where T : Visual
        {
            T child = default(T);
            int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
            for (int i = 0; i < numVisuals; i  )
            {
                Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
                child = v as T;
                if (child == null)
                {
                    child = GetVisualChild<T>(v);
                }
                if (child != null)
                {
                    break;
                }
            }
            return child;
        } 
}
  

Фактический код:
ctor:

 _scrollViewer2 = VisualTreeUtilities.GetVisualChild<ScrollViewer>(this.dataGrid);


private void DataGrid_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            switch (e.Key)
            {
                case Key.PageUp:
                    _scrollViewer2.PageUp();
                    e.Handled = true;
                    break;
             }
         }
  

Таким образом, я могу отлично прокручивать, несмотря на использование группировок. Единственная проблема, которая остается, заключается в том, что Datagrid не переносит фактический SelectedItem с ним вниз при подкачке вниз или вверх при подкачке вверх. Выделенная ячейка остается в прежнем положении и вне поля зрения при смене страницы. Я хотел бы, чтобы это было похоже на Excel, когда выделенная ячейка остается там. Это означает, что когда выбрана вторая ячейка третьей строки и вы перелистываете страницу вниз, все равно будет выбрана вторая ячейка третьей строки. Как я мог бы сделать что-то подобное в сетке данных WPF?

Мне нужно понять, как это работает внутренне. Как ListCollectionView узнает, сколько строк нужно перелистать вниз? если бы я знал, как он ведет обратный отсчет строк, я мог бы использовать тот же принцип для обратного отсчета строк и установить SelectedItem в эту позицию и создать ячейку.focus() и проблема решена.

Кто-нибудь может помочь мне понять недостающий бит?

Большое спасибо,