使用 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 是: 【参考方案2】:

我最终在 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:可以避免选择多行吗?

数据库提取器----知识点

C# 选中 DataGridView 控件中的行时显示不同的颜色

从 ASP 列表框中获取所有选定的值