У меня есть элемент управления 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, за исключением того, что я предоставлю более подробную информацию.