当PropertyGrid删除此项时,如何触发扩展BindingList的Item的删除事件?

时间:2012-01-18 14:07:55

标签: c# bindinglist

问题在于,我使用了这个扩展的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删除项目,如何捕获已删除的事件?
  4. 示例:

    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编辑集合时,我没有关于已删除项目的消息?

1 个答案:

答案 0 :(得分:1)

  

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

问题的根源是PropertyGrid为BindingList编辑调用了standard collection editor。此编辑器根本不对集合项使用Remove()方法,而是对编辑后列表中存在的每个项目仅使用IList.Clear()方法和IList.Add()方法(可以传递{{3有关详细信息,请参阅Reflector方法。