使用SelectionMode = Multiple数据绑定ListBox

时间:2010-03-24 21:56:28

标签: wpf data-binding listbox

我想要一个WPF ListBox

  • ListBox
  • 中启用多项选择
  • 将ListBox数据绑定到我的视图模型。

这两个要求似乎不相容。我的视图模型有一个ObservableCollection<T>属性可以绑定到这个ListBox;我在XAML中设置了从属性到ListBox.SelectedItems属性的绑定。当我编译时,我收到一个错误,指出SelectedItems属性是只读的,无法从XAML设置。

我是否绑定了错误的控件属性?有没有办法将XAML中的多选ListBox绑定到视图模型集合属性?谢谢你的帮助。

3 个答案:

答案 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

查看我的帖子