本教程将详细介绍如何使用 WPF 的多选框控件 (CheckBox) 实现批量删除功能,并提供完整的代码示例。

1. 界面设计

在 WPF 界面中添加一个 ListBox 控件,用于展示要删除的数据项。在 ListBox 的 ItemTemplate 中添加一个 CheckBox 控件,用于选择要删除的项。同时,添加一个 Button 控件,用于触发删除操作。

<StackPanel>
    <ListBox ItemsSource="{Binding Items}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <CheckBox IsChecked="{Binding IsSelected}" Margin="5"/>
                    <TextBlock Text="{Binding Name}" Margin="5"/>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    <Button Content="删除" Command="{Binding DeleteCommand}" Margin="5"/>
</StackPanel>

2. ViewModel 定义

在 ViewModel 中定义一个集合属性,用于存储要展示的数据项。同时定义一个命令,用于执行删除操作。

public class MainViewModel : INotifyPropertyChanged
{
    public ObservableCollection<ItemViewModel> Items { get; set; }

    private ICommand _deleteCommand;
    public ICommand DeleteCommand
    {
        get
        {
            if (_deleteCommand == null)
            {
                _deleteCommand = new RelayCommand<object>(o => DeleteItems(), o => CanDeleteItems());
            }
            return _deleteCommand;
        }
    }

    private void DeleteItems()
    {
        for (int i = Items.Count - 1; i >= 0; i--)
        {
            if (Items[i].IsSelected)
            {
                Items.RemoveAt(i);
            }
        }
    }

    private bool CanDeleteItems()
    {
        return Items != null && Items.Any(item => item.IsSelected);
    }

    // INotifyPropertyChanged implementation...
}

3. 数据模型

定义一个数据模型 ItemViewModel,用于表示每个数据项,包含 IsSelected 属性 (用于标记是否选中) 和 Name 属性 (用于显示数据项的名称)。

public class ItemViewModel : INotifyPropertyChanged
{
    private bool _isSelected;
    public bool IsSelected
    {
        get { return _isSelected; }
        set
        {
            if (_isSelected != value)
            {
                _isSelected = value;
                OnPropertyChanged(nameof(IsSelected));
            }
        }
    }

    public string Name { get; set; }

    // INotifyPropertyChanged implementation...
}

4. 命令绑定和删除逻辑

在 ViewModel 中实现命令的逻辑,即遍历集合属性,将选中的项从集合中移除。同时,将集合属性和命令绑定到界面上的控件。

在 ViewModel 的 DeleteCommand 中,使用 RelayCommand 类实现删除逻辑。RelayCommand 允许您定义命令的执行方法 (DeleteItems) 和执行条件 (CanDeleteItems)。

CanDeleteItems 方法用于判断是否可以执行删除操作,即至少要选中一个项。DeleteItems 方法遍历 Items 集合,如果发现选中项,则将其移除。

最后,在界面中将 Items 属性绑定到 ListBox 的 ItemsSource 属性,并将 DeleteCommand 绑定到 Button 的 Command 属性。

5. 运行程序

运行程序,选择要删除的项,点击“删除”按钮,可以看到选中的项已经从集合中移除。

代码示例

完整代码示例如下:

using GalaSoft.MvvmLight.Command;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;

// ViewModel
public class MainViewModel : INotifyPropertyChanged
{
    public ObservableCollection<ItemViewModel> Items { get; set; }

    private ICommand _deleteCommand;
    public ICommand DeleteCommand
    {
        get
        {
            if (_deleteCommand == null)
            {
                _deleteCommand = new RelayCommand<object>(o => DeleteItems(), o => CanDeleteItems());
            }
            return _deleteCommand;
        }
    }

    private void DeleteItems()
    {
        for (int i = Items.Count - 1; i >= 0; i--)
        {
            if (Items[i].IsSelected)
            {
                Items.RemoveAt(i);
            }
        }
    }

    private bool CanDeleteItems()
    {
        return Items != null && Items.Any(item => item.IsSelected);
    }

    public MainViewModel()
    {
        Items = new ObservableCollection<ItemViewModel>
        {
            new ItemViewModel { Name = "Item 1" },
            new ItemViewModel { Name = "Item 2" },
            new ItemViewModel { Name = "Item 3" }
        };
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

// 数据模型
public class ItemViewModel : INotifyPropertyChanged
{
    private bool _isSelected;
    public bool IsSelected
    {
        get { return _isSelected; }
        set
        {
            if (_isSelected != value)
            {
                _isSelected = value;
                OnPropertyChanged(nameof(IsSelected));
            }
        }
    }

    public string Name { get; set; }

    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

上述代码示例中,使用了 GalaSoft.MvvmLight 库的 RelayCommand 类,需要在项目中添加对该库的引用。

本教程详细介绍了如何使用多选框控件实现批量删除功能,希望对您有所帮助。

WPF 多选框删除内容教程:使用 CheckBox 实现批量删除

原文地址: https://www.cveoy.top/t/topic/nfAc 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录