C# WPF:选中多个CheckBox批量删除ListView行并更新XML文件
嘿,我来帮你搞定这个WPF里带CheckBox列的ListView批量删除+XML数据更新的需求,咱们一步步捋清楚:
1. 先给数据模型加选中状态绑定
首先你得给每个ListView行对应的数据类加一个IsSelected布尔属性,还要实现INotifyPropertyChanged,这样CheckBox的选中状态能和后台数据双向同步。举个例子:
public class TrilogiItem : INotifyPropertyChanged { private bool _isSelected; public bool IsSelected { get => _isSelected; set { _isSelected = value; OnPropertyChanged(nameof(IsSelected)); } } // 这里放你的其他属性,比如用SharpSerializer序列化的图片(存成byte数组就行)、名称之类的 public byte[] ItemImage { get; set; } public string ItemName { get; set; } // 实现INotifyPropertyChanged的标准代码 public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName)); } }
然后把XAML里的CheckBox列和这个属性绑定,记得要双向绑定:
<ListView Name="Trilogi" HorizontalAlignment="Left" Height="201" Margin="265,10,0,0" VerticalAlignment="Top" Width="240"> <ListView.View> <GridView> <GridViewColumn Header="" Width="30"> <GridViewColumn.CellTemplate> <DataTemplate> <!-- 重点:双向绑定IsSelected属性 --> <CheckBox IsChecked="{Binding IsSelected, Mode=TwoWay}" /> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> <!-- 你的其他列,比如显示内容的列 --> <GridViewColumn Header="项目名称" DisplayMemberBinding="{Binding ItemName}" Width="200"/> </GridView> </ListView.View> </ListView>
另外,建议用ObservableCollection<TrilogiItem>作为ListView的ItemsSource,这样删除行的时候UI会自动刷新,不用手动折腾。
2. 实现批量删除逻辑
加个删除按钮,点击后找出所有选中的项删掉,然后更新XML:
<Button Content="批量删除" Click="DeleteSelected_Click" Margin="265,220,0,0" HorizontalAlignment="Left" Width="240"/>
后台代码写点击事件:
// 全局维护你的数据源集合 private ObservableCollection<TrilogiItem> _trilogiItems; // 窗口初始化时加载XML里的数据 public MainWindow() { InitializeComponent(); _trilogiItems = LoadItemsFromXml(); Trilogi.ItemsSource = _trilogiItems; } private void DeleteSelected_Click(object sender, RoutedEventArgs e) { // 先把选中的项转成List,避免遍历集合的时候修改原集合报错 var selectedToDelete = _trilogiItems.Where(item => item.IsSelected).ToList(); foreach (var item in selectedToDelete) { _trilogiItems.Remove(item); } // 删除完立刻把更新后的集合存回XML SaveItemsToXml(_trilogiItems); }
3. 用SharpSerializer读写XML(包含图片)
SharpSerializer处理带图片的序列化很方便,直接把图片转成byte数组存在数据模型里就行,它会自动处理。读写代码如下:
private ObservableCollection<TrilogiItem> LoadItemsFromXml() { // true表示用XML格式序列化,false是二进制 var serializer = new SharpSerializer(true); try { // 读XML文件,不存在就返回空集合 return serializer.Deserialize("TrilogiData.xml") as ObservableCollection<TrilogiItem> ?? new ObservableCollection<TrilogiItem>(); } catch (FileNotFoundException) { return new ObservableCollection<TrilogiItem>(); } } private void SaveItemsToXml(ObservableCollection<TrilogiItem> items) { var serializer = new SharpSerializer(true); // 把集合序列化到XML文件 serializer.Serialize(items, "TrilogiData.xml"); }
别忘了先通过NuGet安装SharpSerializer包哦,直接搜名字就能找到。
几个关键注意点
- 必须用
ObservableCollection,不然删除项后ListView不会自动刷新UI。 - 数据模型一定要实现
INotifyPropertyChanged,不然CheckBox的选中状态不会同步到后台数据里,你就拿不到哪些项要删。 - 图片转byte数组的方法:如果是
BitmapImage,可以用MemoryStream把它转成byte[]存起来,这样SharpSerializer才能正常序列化。
内容的提问来源于stack exchange,提问作者Dorian Ben Haim
相关产品推荐
相关产品推荐

