public static void ScrollToDataGridItem(DataGrid grid, object itemObject, bool scrollOnlyIfNotInView) { // Verify that the item is not visible. Only scroll if it is not visible. // ---------------------------------------------------------------------- if (scrollOnlyIfNotInView) { ScrollViewer scrollViewer = (ScrollViewer)VisualTreeUtils.GetDescendantByType(grid, typeof(ScrollViewer)); FrameworkElement listBoxItem = (FrameworkElement)grid.ItemContainerGenerator.ContainerFromItem(itemObject); if (scrollViewer != null && listBoxItem != null) { if (IsFullyVisible(listBoxItem, scrollViewer)) { return; } } } // Scroll to the bottom of the list. This is a workaround which puts the // desired Item at the top of the list when executing ScrollIntoView // --------------------------------------------------------------------- grid.UpdateLayout(); // This seems required to get correct positioning. grid.ScrollIntoView(grid.Items[grid.Items.Count - 1]); // Scroll to the desired Item // -------------------------- grid.UpdateLayout(); // This seems required to get correct positioning. grid.ScrollIntoView(itemObject); }