使用 SelectionMode = Multiple 对 ListBox 进行数据绑定
Posted
技术标签:
【中文标题】使用 SelectionMode = Multiple 对 ListBox 进行数据绑定【英文标题】:Databinding a ListBox with SelectionMode = Multiple 【发布时间】:2011-01-31 11:41:59 【问题描述】:我想要一个 WPF ListBox
ListBox
中启用多项选择,并且
将 ListBox 数据绑定到我的视图模型。
这两个要求似乎不兼容。我的视图模型有一个 ObservableCollection<T>
属性来绑定到这个 ListBox;我在 XAML 中设置了从属性到 ListBox.SelectedItems
属性的绑定。编译时,我收到一条错误消息,指出 SelectedItems
属性是只读的,无法从 XAML 设置。
我是否绑定了错误的控件属性?有没有办法将 XAML 中的多选 ListBox 绑定到视图模型集合属性?感谢您的帮助。
【问题讨论】:
【参考方案1】:你可以做些什么来解决这个问题:
在列表中显示的项目上创建 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>
(可能需要基于样式的属性,不确定)
现在,只要列表框项被选中,您的视图模型就会知道它并可以根据需要更新其内部集合。
【讨论】:
我希望您包含视图模型代码...不确定该属性应使用哪些数据类型。 IsSelected 属性是一个布尔值。 这是一个非常好的解决方案。以防万一,对于 DataGrid,Xaml 是:我最终在 SelectionChanged 事件处理程序中使用了一些代码隐藏来设置视图模型属性。比创建对象包装器更简单。
【讨论】:
【参考方案3】:我已经发布了一种技术,允许只读绑定到 WPF DataGrid 的 SelectedItems
属性,只需扩展我认为可以轻松地为 ListBox 选择的 DataGrid。你可以在https://***.com/a/16953833/62278看到我的帖子
【讨论】:
以上是关于使用 SelectionMode = Multiple 对 ListBox 进行数据绑定的主要内容,如果未能解决你的问题,请参考以下文章
java 来自http://stackoverflow.com/questions/23720140/using-factory-pattern-with-multiple-arguments-in-
C++ TBB concurrent_unordered_map find() at() return static_cast<size_t>( t ) * internal::hash_multip
Fabric React:GroupedList:可以避免选择多行吗?