当PropertyGrid删除扩展BindingList的项时,如何激发该项的删除事件

本文关键字:删除 何激发 事件 BindingList PropertyGrid 扩展 | 更新日期: 2023-09-27 18:20:34

问题是,我使用这个扩展的BindingList

public class RemoveItemEventArgs : EventArgs
{
    public Object RemovedItem
    {
        get { return removedItem; }
    }
    private Object removedItem;
    public RemoveItemEventArgs(object removedItem)
    {
        this.removedItem = removedItem;
    }
}
public class MyBindingList<T> : BindingList<T>
{
    public event EventHandler<RemoveItemEventArgs> RemovingItem;
    protected virtual void OnRemovingItem(RemoveItemEventArgs args)
    {
        EventHandler<RemoveItemEventArgs> temp = RemovingItem;
        if (temp != null)
        {
            temp(this, args);
        }
    }
    protected override void RemoveItem(int index)
    {
        OnRemovingItem(new RemoveItemEventArgs(this[index]));
        base.RemoveItem(index);
    }
    public MyBindingList(IList<T> list)
        : base(list)
    {
    }
    public MyBindingList()
    {
    }
}

我创建了这个扩展类的一个实例,然后尝试使用PropertyGrid对其进行编辑。当我删除一个项目时,它不会触发删除事件。但是当我使用方法RemoveAt(...)编辑实例时,它工作得很好。

  1. 问题的根源是什么
  2. PropertyGrid使用哪种方法删除项目
  3. PropertyGrid删除项目时,如何捕捉已删除的事件

示例:

public class Answer
{
    public string Name { get; set; }
    public int Score { get; set; }
}
public class TestCollection
{
    public MyBindingList<Answer> Collection { get; set; }
    public TestCollection()
    {
        Collection = new MyBindingList<Answer>();
    }
}
public partial class Form1 : Form
{
    private TestCollection _list;
    public Form1()
    {
        InitializeComponent();
    }
    void ItemRemoved(object sender, RemoveItemEventArgs e)
    {
        MessageBox.Show(e.RemovedItem.ToString());
    }
    void ListChanged(object sender, ListChangedEventArgs e)
    {
        MessageBox.Show(e.ListChangedType.ToString());
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        _list = new TestCollection();
        _list.Collection.RemovingItem += ItemRemoved;
        _list.Collection.ListChanged += ListChanged;
        Answer q = new Answer {Name = "Yes", Score = 1};
        _list.Collection.Add(q);
        q = new Answer { Name = "No", Score = 0 };
        _list.Collection.Add(q);
        propertyGrid.SelectedObject = _list;
    }
}

为什么当我通过PropertyGrid编辑集合时,我有新项的消息,但没有删除项的消息?

当PropertyGrid删除扩展BindingList的项时,如何激发该项的删除事件

问题的根源是什么?PropertyGrid使用哪种方法删除项?

问题的根源是PropertyGrid调用了用于BindingList编辑的标准集合编辑器。此编辑器根本不对集合项使用Remove()方法,而只对编辑后列表中存在的每个项使用IList.Clear()方法和IList.Add()方法(您可以将CollectionEditor.SetItems()法传递给Reflector以获取更多详细信息)。