У меня есть WPF ListBox
то, что я хотел бы
ListBox
, иЭти два требования, кажется, являются несовместимыми. Моя модель представления имеет ObservableCollection<T>
свойство для привязки с этим ListBox; я настроил привязку в XAML от свойства до ListBox.SelectedItems
свойство. Когда я скомпилировал, я получил ошибку при высказывании что SelectedItems
свойство было только для чтения и не могло быть установлено от XAML.
Я связываю с неправильным свойством элемента управления? Существует ли способ связать множественный выбор ListBox в XAML к свойству набора модели представления?Спасибо за помощь.
В итоге я использовал небольшой код программной части в обработчике событий SelectionChanged, чтобы установить свойство модели представления. Проще, чем создавать обертки для объектов.
Что вы можете сделать, чтобы обойти это:
Создайте свойство 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 будет выбран, ваша модель представления будет знать об этом и может обновлять свою внутреннюю коллекцию по мере необходимости.