Привязка данных ListBox с SelectionMode = несколько

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

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

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

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

13
задан David Veeneman 24 March 2010 в 21:56
поделиться

2 ответа

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

7
ответ дан 1 December 2019 в 20:42
поделиться

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

Создайте свойство 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>

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

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

22
ответ дан 1 December 2019 в 20:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: