You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:54:06