【问题标题】:Databinding a ListBox with SelectionMode = Multiple使用 SelectionMode = Multiple 对 ListBox 进行数据绑定
【发布时间】:2011-01-31 11:41:59
【问题描述】:

我想要一个 WPF ListBox

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

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

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

【问题讨论】:

    标签: wpf data-binding 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://stackoverflow.com/a/16953833/62278看到我的帖子

      【讨论】:

        猜你喜欢
        • 2010-12-05
        • 1970-01-01
        • 2013-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-03
        • 1970-01-01
        相关资源
        最近更新 更多