У меня есть два представления некоторых данных: теперь вид списка (a ListBox
, но я имею в виду переход на ListView
) и фантастическое графическое представление на карте. В любом представлении пользователь может щелкнуть объект, и он будет выбран в обоих представлениях. Также возможен мультиселектор, поэтому каждый экземпляр ViewModel
имеет свое собственное свойство IsSelected
.
В настоящее время я привязываю ListBoxItem.IsSelected
к ViewModel.IsSelected
, но это работает корректно, если ListBox
НЕ виртуализируется (см. здесь). К сожалению, отключение виртуализации ухудшает производительность, и мое приложение стало слишком медленным.
Поэтому мне нужно снова включить виртуализацию. Чтобы сохранить свойство ViewModel.IsSelected
элементов вне экрана, я заметил, что ListBox
и ListView
имеют событие SelectionChanged
, которое я могу (предположительно) использовать для распространения состояния выбора из ListBox/ListView
в ViewModel
.
Мой вопрос: как мне распространять состояние выбора в обратном направлении? Свойство SelectedItems
ListBox/ListView
доступно только для чтения! Предположим, что пользователь нажимает на элемент в графическом представлении, но он находится вне экрана w.r.t. список. Если я просто установил ViewModel.IsSelected
, тогда ListBox/ListView
не будет знать о новом выборе, и, как следствие, он не сможет отменить выбор этого элемента, если пользователь нажмет на него другой элемент в списке. Я мог бы вызвать ListBox.ScrollIntoView
из ViewModel
, но есть несколько проблем:
- В моем пользовательском интерфейсе фактически можно выбрать два элемента одним щелчком мыши, если они находятся в одном и том же месте графически, хотя они могут находиться в совершенно разных местах в
ListBox/ListView
. - Он разбивает изоляцию ViewModel (мой ViewModel полностью не знает WPF, и я хотел бы сохранить его таким образом.)
Итак, мои дорогие эксперты WPF, любые мысли?
EDIT: я перешел на управление Infragistics и использовал уродливое и довольно медленное решение. Дело в том, что мне больше не нужен ответ.