WPF ListViewコントロールがあり、ItemsSourceは次のように作成されたICollectionViewに設定されています。
var collectionView =
System.Windows.Data.CollectionViewSource.GetDefaultView(observableCollection);
this.listView1.ItemsSource = collectionView;
...ここで、observableCollectionは複合型のObservableCollectionです。ListViewは、アイテムごとに、複合型の1つの文字列プロパティのみを表示するように構成されています。
ユーザーはListViewを更新できます。その時点で、ロジックは現在選択されているアイテムの「キー文字列」を格納し、基になるobservableCollectionを再入力します。次に、前の並べ替えとフィルターがcollectionViewに適用されます。この時点で、更新要求の前に選択されていたアイテムを「再選択」したいと思います。observableCollectionのアイテムは新しいインスタンスなので、それぞれの文字列プロパティを比較して、一致するものを選択します。このような:
private void SelectThisItem(string value)
{
foreach (var item in collectionView) // for the ListView in question
{
var thing = item as MyComplexType;
if (thing.StringProperty == value)
{
this.listView1.SelectedItem = thing;
return;
}
}
}
これはすべて機能します。4番目の項目が選択され、ユーザーがF5キーを押すと、リストが再構成され、前の4番目の項目と同じ文字列プロパティを持つ項目が選択されます。これは新しい4番目の項目である場合もあれば、そうでない場合もありますが、「驚き最小の動作」を提供します。
この問題は、ユーザーがその後矢印キーを使用してListView内を移動するときに発生します。更新後の最初の上矢印または下矢印により、前のロジックで選択されたアイテムに関係なく、(新しい)リストビューの最初のアイテムが選択されます。それ以降の矢印キーは期待どおりに機能します。
なぜこうなった?
これは明らかに「驚き最小の原則」のルールに違反しています。どうすればそれを回避できますか?
編集さらに検索すると、これは、詳細を提供することを除いて、未回答のWPFListViewの矢印ナビゲーションとキーストロークの問題
で
説明されているのと同じ異常のようです。