为了克服虚拟化问题,但仍然使用ScrollIntoView
而不是在 ListView 的内部乱窜,您还可以使用 ViewModel 对象来确定选择的内容。假设您的列表中有具有IsSelected
属性的 ViewModel 对象。您可以将项目链接到 XAML 中的 ListView,如下所示:
<ListView Name="PersonsListView" ItemsSource="{Binding PersonVMs}">
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
</Style>
</ListView.ItemContainerStyle>
</ListView>
然后,代码隐藏方法可以滚动到第一个选定的项目:
var firstSelected = PersonsListView.Items
.OfType<TreeViewItemViewModel>().FirstOrDefault(x => x.IsSelected);
if (firstSelected != null)
CoObjectsListView.ScrollIntoView(firstSelected);
如果所选项目完全不在视线范围内,这也有效。在我的实验中,该PersonsListView.SelectedItem
属性是null
,但当然您的 ViewModelIsSelected
属性始终存在。请务必在所有绑定和加载完成后调用此方法(使用右侧的DispatcherPriority
)。
使用ViewCommand模式,您的 ViewModel 代码可能如下所示:
PersonVMs.ForEach(vm => vm.IsSelected = false);
PersonVMs.Add(newPersonVM);
newPersonVM.IsSelected = true;
ViewCommandManager.InvokeLoaded("ScrollToSelectedPerson");