c# - 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>
解决方案
您的 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, ... });
}
推荐阅读
- angular - 如何在 Angular 7 中等待 DOM 更改就绪?
- angular - 如何使用 Angular 在 Stackblitz 中导入 Lodash?
- node.js - 在 linux 上使用 npm serialport 库从微控制器接收的数据除了所有正确的字节外还有一些垃圾字节
- reactjs - 在 useEffect 中反应钩子道具
- ruby-on-rails - 对已存在的模型使用 gem 'devise' 时出错
- dynamic-programming - 问题可以通过动态规划方法或回溯来解决
- docker - 码头工人。Tomcat7不运行
- c# - 如何加快 YouTube 的 tesseract OCR 读取速度?C#
- javascript - 错误:无法在视图目录中查找视图“location.ejs”
- python - python中的函数,用于从csv中的列与输入字符串返回第一个完全匹配