排序后WPF DataGrid滚动到顶部

bks*_*ill 4 .net vb.net wpf wpfdatagrid

我有一个使用数据网格的.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
Run Code Online (Sandbox Code Playgroud)

但这似乎在排序发生之前触发,并且不执行滚动.

思考?

Bel*_*oda 8

我不知道VB中的语法,但我认为它应该是一样的.这是在C#中:

var border = VisualTreeHelper.GetChild(myDataGrid, 0) as Decorator;
if (border != null)
{
    var scrollViewer = border.Child as ScrollViewer;
    scrollViewer.ScrollToTop();
}
Run Code Online (Sandbox Code Playgroud)

通常,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();
    }
}
Run Code Online (Sandbox Code Playgroud)