我有一个 WPF ListView 控件,ItemsSource 设置为以这种方式创建的 ICollectionView:
var collectionView =
System.Windows.Data.CollectionViewSource.GetDefaultView(observableCollection);
this.listView1.ItemsSource = collectionView;
...其中 observableCollection 是复杂类型的 ObservableCollection。ListView 被配置为对每个项目仅显示复杂类型的一个字符串属性。
用户可以刷新 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 中导航时,问题就出现了。刷新后的第一个向上或向下箭头会导致选择(新)列表视图中的第一个项目,无论之前的逻辑选择了哪个项目。任何进一步的箭头键都按预期工作。
为什么会这样?
这很明显违反了“最小惊讶”规则。我怎样才能避免它?
编辑
经过进一步搜索,这似乎与未回答的
WPF ListView 箭头导航和击键问题所描述的异常相同,但我提供了更多详细信息。