我有一项艰巨的任务需要解决。使用WPF Datagrid时,只要您没有任何分组,Paging就可以正常工作。
然而,只要分组进入该位置,就会变得有点棘手。事实上,pageup / down不再正常工作。
我发现一个解决方法是使用以下方法访问dataGrid内部包装的内部滚动查看器:
助手类:
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;
}
}
实际代码: 构造函数:
_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设置为该位置并执行cell.focus()并解决问题。
任何人都可以帮我理解丢失的位吗?
非常感谢,