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