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

15

我有这段代码:

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

这会生成以下窗口:

代码渲染的窗口

如何知道有多少个复选框被选中,并获取每个选中的CheckBoxTag值?


你能否更详细地说明你想要实现什么? - Rohit Vats
我使用复选框来删除所选择的行,但是我无法获取已选中的复选框的值标签。 - Nhu Nguyen
1
你绑定到 ListView 的对象集合具有一个 ID 属性,该属性已与 Checkbox 的 Tag 属性绑定。相反,应该在该对象中具有一个布尔属性,并将其与 Checkbox 的 IsChecked 属性绑定。然后,您可以在视图模型中简单地迭代您的集合,并查看用户选择了哪些项目。您还需要注意以下事项:1. 使您的对象实现 INotifyPropertyChanged。2. 对于 Checkbox,请使用双向绑定。如果您需要一些示例代码,请告诉我们。 - publicgk
3个回答

24

我知道这已经很旧了,但是为了记录,如果有人偶然发现了这个问题,这里是解决方案。

<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个记录。


7

它应该很简单,只需将CheckBoxIsChecked属性绑定到ViewModel的一个属性上(如果不存在,则需要添加一个新属性)。然后,一旦按钮被点击,你只需要遍历集合中的所有项目,并删除已选中的项目(基于ViewModel上属性的值)。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接