Связывание с ListBox с помощью SelectionMode = Несколько

У меня есть WPF ListBox, который я хотел бы

  • Включить множественный выбор в ListBox и
  • привязать ListBox к моей модели представления.

Эти два требования кажутся несовместимыми. Моя модель представления имеет свойство ObservableCollection<T> для привязки к этому элементу ListBox; Я установил привязку в XAML из свойства в свойство ListBox.SelectedItems. Когда я скомпилировал, у меня возникла ошибка, говоря, что свойство SelectedItems было только для чтения и не могло быть установлено из XAML.

Я привязываюсь к неправильному свойству управления? Есть ли способ привязать список ListBox с множественным выбором в XAML к свойству коллекции модели представления? Благодарим за помощь.

Ответы

Ответ 1

В результате в обработчике событий SelectionChanged я использовал немного кода для установки свойства модели представления. Проще чем создавать обертки объектов.

Ответ 2

Что вы можете сделать, чтобы обойти это:

Создайте свойство IsSelected для элементов, отображаемых в списке. Im, предполагая, что они представлены моделью просмотра. Таким образом, не должно быть драмы, чтобы добавить дополнительное свойство. Если это просто бизнес-объекты, подумайте об использовании класса-обертки, чтобы безболезненно обернуть их в виде элементов модели (бесстыдная плагин - здесь - одна из таких систем. это ежедневно, чтобы обернуть мои бизнес-объекты)

Используйте стиль контейнера элементов, чтобы привязать свойство IsSelected элемента списка к свойству IsSelected элементов, которые вы показываете, например

    <ListBox.ItemContainerStyle>
       <!-- This Style binds a ListBoxItem to a the ViewModelItem. -->
       <Style
          TargetType="{x:Type ListBoxItem}">
          <Setter
             Property="IsSelected"
             Value="{Binding IsSelected, Mode=TwoWay}" />
       </Style>
    </ListBox.ItemContainerStyle>

(может потребоваться основанный на атрибуте стиль, не уверен)

Теперь, когда элемент списка выбирается, ваша модель просмотра будет знать об этом и может обновлять свою внутреннюю коллекцию по мере необходимости.

Ответ 3

Я опубликовал метод, позволяющий привязку только для чтения к свойству SelectedItems WPF DataGrid, просто расширив DataGrid, который, как я считаю, может быть легко кооптирован для ListBox. Вы можете видеть мой пост в fooobar.com/info/391720/...