#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() и проблема решена.
Кто-нибудь может помочь мне понять недостающий бит?
Большое спасибо,