我有一个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;
}
}
}
这个都可以正常工作。如果选择了第四项,并且用户按下F5键,则列表将被重组,然后选择具有与之前的第四项相同的字符串属性的项目。有时这是新的第四项,有时不是,但它提供了“最小惊讶行为原则”。
问题出现在用户随后使用箭头键在ListView中导航时。刷新后的第一个向上或向下箭头使得(新的)listview中的第一项被选中,而不管之前逻辑选择了哪个项目。任何进一步的箭头键都按预期工作。
这是为什么?
这显然违反了“最小惊讶”原则。我该如何避免这种情况?
编辑
经过进一步搜索,这似乎是未回答的WPF ListView箭头导航和按键问题所描述的相同异常,只是我提供了更多细节。