Кажется, здесь есть два сценария.Один из них - когда вы вручную выбираете элемент в DataGrid
, а другой - когда свойство источника для SelectedItem
изменяется в вашей модели представления.Поведение в указанной вами ссылке будет срабатывать для обоих.
Способ работы ScrollIntoView
заключается в том, что он будет прокручиваться вверх, если новый выбранный элемент находится выше ранее выбранного элемента (оставляя его сверху), и прокручиватьвниз, если новый выбранный элемент находится ниже (оставляя его внизу), и прокрутки нет вообще, если выбранный элемент уже виден пользователю.Таким образом, вы не всегда получите выбранный элемент в нижней части DataGrid
. Если вы хотите, чтобы SelectedItem
всегда отображался в верхней части сетки (если это возможно), вы можете сделать это с помощьюпрокручиваем вниз, перед тем как сделать grid.ScrollIntoView(grid.SelectedItem, null);
.Это имеет побочный эффект: SelectedItem
будет всегда отображаться сверху, даже если он был выбран мышью, клавиатурой и т. Д.
Чтобы иметь возможность прокручивать DataGrid
программно, вам нужно создать ScrollableDataGrid
, который получается из DataGrid
public class ScrollableDataGrid : DataGrid
{
private IScrollProvider m_scrollProvider;
public ScrollableDataGrid()
{
m_scrollProvider = OnCreateAutomationPeer() as IScrollProvider;
}
public void ScrollToBottom()
{
while (m_scrollProvider.VerticalScrollPercent < 100)
{
m_scrollProvider.Scroll(ScrollAmount.NoAmount, ScrollAmount.LargeIncrement);
}
}
}
Затем вы можете немного изменить поведение, чтобы получить эффект "прокрутки вверх"
void AssociatedObject_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (sender is ScrollableDataGrid)
{
ScrollableDataGrid grid = (sender as ScrollableDataGrid);
if (grid.SelectedItem != null)
{
grid.Dispatcher.BeginInvoke(delegate
{
grid.ScrollToBottom();
grid.UpdateLayout();
grid.ScrollIntoView(grid.SelectedItem, null);
});
}
}
}