首页 > 解决方案 > C# WPF 循环和删除选中的 ListView 项目

问题描述

作为最近从 WinForms 切换到 WPF 的人,我仍在努力寻找一种方法来循环删除已检查的 ListView items

此方法给我错误:“ListView 不包含 CheckedItems 的定义...”

    if (lvFilesList != null)
    {
        foreach (ListViewItem lvItem in lvFilesList.CheckedItems)
        {
            lvItem.Checked = False;
        }
    }

我的 XAML 代码:

            <ListView Height="400" Width="400"
              Name="lvFilesList"                       
              ItemsSource="{Binding}"
              IsSynchronizedWithCurrentItem="True">
                <ListView.View>
                    <GridView>
                        <GridView.Columns>
                            <GridViewColumn>
                                <GridViewColumn.CellTemplate>
                                    <DataTemplate>
                                        <CheckBox Name="chk" IsChecked="{Binding IsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></CheckBox>
                                    </DataTemplate>
                                </GridViewColumn.CellTemplate>
                            </GridViewColumn>
                            <GridViewColumn Header="ID" DisplayMemberBinding="{Binding ID}"/>
                            <GridViewColumn Header="File" DisplayMemberBinding="{Binding File}"/>
                            <GridViewColumn Header="Author" DisplayMemberBinding="{Binding Author}"/>
                        </GridView.Columns>
                    </GridView>
                </ListView.View>
                <ListView.GroupStyle>
                    <GroupStyle>
                        <GroupStyle.HeaderTemplate>
                            <DataTemplate>
                                <TextBlock FontWeight="Bold" Text="Group"/>
                            </DataTemplate>
                        </GroupStyle.HeaderTemplate>
                    </GroupStyle>
                </ListView.GroupStyle>
            </ListView>

标签: c#wpf

解决方案


您的 ListView 的 ItemsSource 直接绑定到当前 DataContext 看起来很奇怪

ItemsSource="{Binding}"

DataContext 通常会保存一个具有集合类型属性的视图模型对象,例如

public class Item
{
    public bool IsChecked { get; set; }

    // other properties like ID, File, Author
}

public class ViewModel
{
    public ObservableCollection<Item> Items { get; }
        = new ObservableCollection<Item>();
}

绑定将是

ItemsSource="{Binding Items}"

然后视图模型可以有一个删除所有选中项的方法,比如

public void DeleteCheckedItems()
{
    var checkedItems = Items.Where(item => item.IsChecked).ToList();

    checkedItems.ForEach(item => Items.Remove(item));
}

请注意,您通常将视图模型类的实例分配给主视图的 DataContext,例如在 MainWindow 构造函数中:

private readonly ViewModel viewModel = new ViewModel();

public MainWindow()
{
    InitializeComponent();
    DataContext = viewModel;

    viewModel.Items.Add(new Item { ID = 1, ... });
    viewModel.Items.Add(new Item { ID = 2, ... });
}

推荐阅读