WPF ListViewItem 项目复选框。如何获取所有选定的项目?

Posted

技术标签:

【中文标题】WPF ListViewItem 项目复选框。如何获取所有选定的项目?【英文标题】:WPF ListViewItem item CheckBox. How to get all selected items? 【发布时间】:2011-08-02 03:16:58 【问题描述】:

我有这个代码:

<ListView Height="238" 
          HorizontalAlignment="Left" 
          Name="listView1" 
          VerticalAlignment="Top" 
          Width="503"
          ItemsSource="Binding"
          IsSynchronizedWithCurrentItem="True">
  <ListView.View>
    <GridView>
      <GridView.Columns>
        <GridViewColumn>
          <GridViewColumn.CellTemplate>
            <DataTemplate>
              <CheckBox Tag="Binding ID"/>
            </DataTemplate>
          </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn DisplayMemberBinding="Binding ID" Header="ID" />
        <GridViewColumn DisplayMemberBinding="Binding Name" Header="Name" />
      </GridView.Columns>
    </GridView>
  </ListView.View>
</ListView>

产生这个窗口:

我如何知道选中了多少个复选框,并获取每个选中的CheckBox 的值Tag

【问题讨论】:

您能否详细说明您想要实现的目标?? 我使用复选框删除行被选中,但我无法获取选中复选框的值标签。 你绑定到 ListView 的对象集合有一个属性 ID,你已经绑定了 Checkbox 的 Tag 属性。相反,在该对象中有一个布尔属性并将其与 Checkbox 的 IsChecked 属性绑定。然后,您可以简单地在视图模型中迭代您的集合,并查看用户选择了哪些项目。您需要注意的其他事项: 1. 使您的对象实现 INotifyPropertyChanged。 2. Checkbox 使用双向绑定。如果您需要一些示例代码,请告诉我们。 【参考方案1】:

它应该像将CheckBoxIsChecked 属性绑定到ViewModel 上的属性一样简单(如果新属性不存在,您可能需要添加它)。然后,单击按钮后,您只需遍历集合中的所有项目,并删除已检查的项目(基于 ViewModel 上的属性值)。

【讨论】:

【参考方案2】:

我知道它已经过时了,但是如果人们发现这个问题,这就是解决方案

<ListView Height="238" 
              HorizontalAlignment="Left" 
              Name="listView1" 
              VerticalAlignment="Top" 
              Width="503"
              ItemsSource="Binding"
              IsSynchronizedWithCurrentItem="True"
              SelectionChanged="listView1_SelectionChanged">
        <ListView.View>
            <GridView>
                <GridView.Columns>
                    <GridViewColumn>
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                               <CheckBox Tag="Binding ID" IsChecked="Binding RelativeSource=RelativeSource AncestorType=x:Type ListViewItem, Path=IsSelected" />  
                           </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn DisplayMemberBinding="Binding ID" Header="ID" />
                    <GridViewColumn DisplayMemberBinding="Binding Name" Header="Name" />
                </GridView.Columns>
            </GridView>
        </ListView.View>
    </ListView>

然后在 cs 文件中的 listView1_SelectionChanged 中编码

private List<MyObject> lstMyObject = new List<MyObject>();

private void listView1_SelectionChanged(object sender, SelectionChangedEventArgs e)

    foreach (MyObject item in e.RemovedItems)
    
        lstMyObject.Remove(item);
    

    foreach (MyObject  item in e.AddedItems)
    
       lstMyObject.Add(item);
    

lstMyObject 应该与绑定到列表的对象类型相同。并且代码将简单地添加和删除对该列表的原始列表项的引用。

现在您要做的就是遍历该列表,该列表将仅包含实际选择的项目。这仅适用于单选,除了 lstMyObject 将始终只包含 1 条记录。

【讨论】:

【参考方案3】:

一个建议...

就像所有 Windows 控件中的 Tag 属性一样,我一直在我的所有数据模型中都有一个 Tag 属性,用于在运行时进行一般用途。我使用该属性来保持 ListView 中项目的选中状态。在其他情况下,我也使用它们来保存复杂的对象。

【讨论】:

以上是关于WPF ListViewItem 项目复选框。如何获取所有选定的项目?的主要内容,如果未能解决你的问题,请参考以下文章

WPF:防止在 Shift + 箭头上选择 ListViewItem

滚动ListViewItem位于ListView的顶部

WPF 点击ListViewItem中的Button,如何获取选中的是第几行?

WPF动态添加带有detals的ListViewItem

求助WPF ListViewItem样式问题

WPF:改变ListBoxItem和ListViewItem的颜色