仮想化の問題を克服しScrollIntoView、ListView の内部をハッキングせずに使用するには、ViewModel オブジェクトを使用して、選択されているものを判断することもできます。プロパティを備えたリストにViewModelオブジェクトがあると仮定しますIsSelected。次のように、項目を 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");