【问题标题】:WPF ListViewItem item CheckBox. How to get all selected items?WPF ListViewItem 项目复选框。如何获取所有选定的项目?
【发布时间】: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 使用双向绑定。如果您需要一些示例代码,请告诉我们。

标签: c# wpf binding wpf-controls


【解决方案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 中项目的选中状态。在其他情况下,我也使用它们来保存复杂的对象。

      【讨论】:

        猜你喜欢
        • 2011-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-20
        • 2017-06-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多