Синхронизация ListBox с множественным выбором с MVVM

У меня есть два представления некоторых данных: представление списка (сейчас ListBox , но я хотел переключиться на ListView ) и красивое графическое представление на карте. В любом представлении пользователь может щелкнуть объект, и он будет выбран в обоих представлениях. Также возможен множественный выбор, поэтому каждый экземпляр 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 и использование уродливого и довольно медленного решения. Дело в том, что мне больше не нужен ответ.

18
задан Community 23 May 2017 в 10:30
поделиться