ListViewのビューに表示されるVMにObservableCollectionがあります。選択したアイテムが変更されると、SelectionChangedイベントが適切に発生します。以下は、ListViewを構成する方法です。
<ListView Grid.Row="3" Margin="5" AlternationCount="2" Name="_lvSettings"
IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding Path=CollectionView}"
SelectedIndex="{Binding Path=SelectedSettingIndex}"
SelectionChanged="OnSelectionChanged" >
<ListView.View>
<GridView>
<GridViewColumn Width="170"
Header="{Binding Path=ShowAllDisplay}"
x:Name="_colSettings"
DisplayMemberBinding="{Binding Path=Setting}"/>
<GridViewColumn Header="Old Value" Width="150"
DisplayMemberBinding="{Binding Path=OldVal}"/>
<GridViewColumn Header="New Value"
DisplayMemberBinding="{Binding Path=NewVal}" />
</GridView>
</ListView.View>
</ListView>
私が抱えている問題は、コレクションのフィルターを変更するときです。選択されたアイテムは同じままです。これは良いことですが、ListViewが最初のアイテムから表示されるように変更され、多くの場合、選択されたアイテムは表示されません(ただし、選択されたアイテムは表示されます)。
VMには、変更時にPropertyChangedイベントをスローするプロパティ「SelectedSettingIndex」があります。フィルタが変更されたときにVMから手動でイベント(base.OnPropertyChanged( "SelectedSettingIndex");)を発生させても、プロパティが実際には変更されていないため、イベントは実際には発生していないようです。このシナリオでは、ScrollIntoViewなどを呼び出す方法が必要ですが、正しいイベントまたはトリガーを見つけることができません。私が行方不明になっているのは何ですか?
編集
これが、私が懸念している問題の、うまくいけばより良い説明です。
1)VMでCollectionViewSourceを使用してデータをフィルタリングしています。
2)ユーザーがフィルターを切り替えるためのボタンがあります。
3)ListViewには、常に最大10個のアイテムを表示する余地があると仮定します。
4)ユーザーは、リストビューのインデックス50にあるフィルターされたビューでアイテム「A」を選択します。
5)次に、ユーザーはボタンをクリックしてフィルタリングをオフにします。
期待される結果:ListViewにはフィルター処理されていないリストが表示され、アイテム「A」は選択されたままになり、アイテム「A」が引き続き表示されるようにListViewが「スクロール」されます。
実際の結果:ListViewにはフィルタリングされていないリストが表示され、アイテム "A"が選択されたままになり、ListViewが一番上に「スクロール」され、最初の10個のアイテムが表示されます。アイテム「A」は表示されていません。