Это решение требует, чтобы виртуализация была отключена, лучше, как предлагал Клеменс, - клонируйте дубликаты, поскольку они являются разными объектами, и вы можете использовать свой подход.
private static DependencyObject FirstVisualChild(UIElement visual)
{
if (visual == null)
return null;
if (VisualTreeHelper.GetChildrenCount(visual) == 0)
return null;
return VisualTreeHelper.GetChild(visual, 0);
}
private void Listview_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var itmFromIdx = listView.ItemContainerGenerator.ContainerFromIndex(listView.SelectedIndex);
ScrollContentPresenter presenter = null;
for (var vis = itmFromIdx as UIElement; vis != null; vis = VisualTreeHelper.GetParent(vis) as UIElement)
if ((presenter = vis as ScrollContentPresenter) != null)
break;
if (presenter == null)
throw new Exception();
var virtStackPnl = FirstVisualChild(presenter.Content as ItemsPresenter);//VirtualizingStackPanel
(virtStackPnl as IScrollInfo).MakeVisible(itmFromIdx as UIElement, new Rect(new Size(0, 0)));
}
XAML:
<ListView x:Name="listView" ... VirtualizingPanel.IsVirtualizing="False">