我有一个使用数据网格的.Net 4.0 WPF应用程序。目前,按列排序后,网格的滚动位置保持在排序之前的位置。
对于这个应用程序,我需要在任何排序后滚动到网格的顶部。
我试过像这样处理排序事件
Private Sub myDataGrid_Sorting(sender As Object, e As System.Windows.Controls.DataGridSortingEventArgs) Handles myDataGrid.Sorting
myDataGrid.ScrollIntoView(myDataGrid.Items(0))
End Sub
但这似乎在排序发生之前触发,并且不执行滚动。
思想?
答案 0 :(得分:6)
我不知道VB中的语法,但我认为它应该是一样的。这是在C#:
var border = VisualTreeHelper.GetChild(myDataGrid, 0) as Decorator;
if (border != null)
{
var scrollViewer = border.Child as ScrollViewer;
scrollViewer.ScrollToTop();
}
通常,DataGrid的第一个Visual子节点是它的装饰器,装饰器的子节点是ScrollViewer。在ScrollViewer中,您可以操作dataGrid中显示的项目。
哦...... VisualTreeHelper帮助你从一个视觉元素导航到你当前所在的内部或外部的下一个视觉元素。我认为它在System.Windows.Media中。
希望这有帮助。干杯
编辑:在我发布之前我忘了提到的另一件事...... 您可能需要覆盖DataGrid中的OnSorting方法。
因此,在您的DataGrid的某些派生类中,将实现此新功能,您将拥有此覆盖。
protected override void OnSorting(DataGridSortingEventArgs eventArgs)
{
base.OnSorting(eventArgs);
var border = VisualTreeHelper.GetChild(myDataGrid, 0) as Decorator;
if (border != null)
{
var scrollViewer = border.Child as ScrollViewer;
scrollViewer.ScrollToTop();
}
}
答案 1 :(得分:0)
这是VB语法。
Private Sub myDataGrid_Sorting(sender As Object, e As System.Windows.Controls.DataGridSortingEventArgs) Handles myDataGrid.Sorting
Dim border As Decorator = VisualTreeHelper.GetChild(myDataGrid, 0)
If border IsNot Nothing Then
Dim scrollViewer As ScrollViewer = border.Child
scrollViewer.ScrollToTop()
End If
End Sub