Update 2023 for .NET 5-7
Install a nuget package Microsoft.Xaml.Behaviors.Wpf, create a class like following:
using Microsoft.Xaml.Behaviors;
using System.Windows.Controls;
using System.Windows;
public class ScrollToSelectedListBoxItemBehavior: Behavior<ListBox>
{
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.SelectionChanged += AssociatedObjectOnSelectionChanged;
AssociatedObject.IsVisibleChanged += AssociatedObjectOnIsVisibleChanged;
}
protected override void OnDetaching()
{
AssociatedObject.SelectionChanged -= AssociatedObjectOnSelectionChanged;
AssociatedObject.IsVisibleChanged -= AssociatedObjectOnIsVisibleChanged;
base.OnDetaching();
}
private static void AssociatedObjectOnIsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
ScrollIntoFirstSelectedItem(sender);
}
private static void AssociatedObjectOnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
ScrollIntoFirstSelectedItem(sender);
}
private static void ScrollIntoFirstSelectedItem(object sender)
{
if (!(sender is ListBox listBox))
return;
var selectedItems = listBox.SelectedItems;
if (selectedItems.Count > 0)
listBox.ScrollIntoView(selectedItems[0]);
}
}
Moving to the XAML editor we need to add a single line:
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
Add this behavior class to ListView
control:
<ListView ItemsSource="{Binding Items}">
<i:Interaction.Behaviors>
<local:ScrollToSelectedListBoxItemBehavior />
</i:Interaction.Behaviors>
</ListView>