我想要一个WPF ListBox
ListBox
和这两个要求似乎不相容。我的视图模型有一个ObservableCollection<T>
属性可以绑定到这个ListBox;我在XAML中设置了从属性到ListBox.SelectedItems
属性的绑定。当我编译时,我收到一个错误,指出SelectedItems
属性是只读的,无法从XAML设置。
我是否绑定了错误的控件属性?有没有办法将XAML中的多选ListBox绑定到视图模型集合属性?谢谢你的帮助。
答案 0 :(得分:22)
你可以做些什么来解决这个问题:
在列表中显示的项目上创建IsSelected属性。我假设这些也由视图模型表示。所以添加一个额外的属性不应该是一个戏剧。如果它们只是业务对象,请考虑使用包装类将它们无缝地包装在视图模型项中(无耻的插件 - here就是这样一个系统。我每天使用它来包装我的业务对象)
使用项容器样式将列表框项的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>
(可能需要基于样式的属性,不确定)
现在,只要选择了一个列表框项目,您的视图模型就会知道它并可以根据需要更新其内部集合。
答案 1 :(得分:7)
我最终在SelectionChanged事件处理程序中使用了一些代码隐藏来设置视图模型属性。比创建对象包装器更简单。
答案 2 :(得分:0)
我发布了一种技术,允许只对WSF DataGrid的SelectedItems
属性进行只读绑定,只需扩展我认为可以轻松为ListBox添加的DataGrid。您可以在https://stackoverflow.com/a/16953833/62278