Как вызвать событие удаления для элемента расширенного BindingList, когда PropertyGrid удаляет этот элемент?

Проблема в том, что я использую этот расширенный 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?

1 ответ

Каков источник проблемы? Какой метод PropertyGrid использует для удаления элемента?

Источником проблемы является то, что PropertyGrid вызвал стандартный редактор коллекций для редактирования BindingList. Этот редактор вообще не использует метод Remove() для элементов коллекции, а только метод IList.Clear() и метод IList.Add() для каждого элемента, который существует в списке после редактирования (вы можете передать CollectionEditor.SetItems() метод к отражателю для более подробной информации).

Другие вопросы по тегам