Привязка данных для ListBox с SelectionMode = Multiple - PullRequest
13 голосов
/ 25 марта 2010

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

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

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

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

Ответы [ 3 ]

22 голосов
/ 25 марта 2010

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

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

Используйте стиль контейнера элементов, чтобы связать свойство 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>

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

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

7 голосов
/ 27 марта 2010

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

0 голосов
/ 06 июня 2013

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

...