Общий класс для получения события добавления / удаления коллекции - PullRequest
1 голос
/ 15 марта 2012
  1. Что вы, люди, думаете об этом решении, чтобы инкапсулировать коллекцию и знать, когда добавляется / удаляется iten.

  2. Как добавить кликабельную ссылку в описание xml?

    // Why does DoNotExposeGenericLists recommend that I expose Collection instead of List? by David Kean"
    // http://blogs.msdn.com/b/codeanalysis/archive/2006/04/27/585476.aspx
    public class CollectionEx<T> : Collection<T>
    {
    public event EventHandler ItemAdded;
    public event EventHandler ItemRemoved;
    
    public CollectionEx()//:base()
    {
    }
    
    protected override void InsertItem(int index, T item)
    {
        base.InsertItem(index, item);
        OnSectionAdded(EventArgs.Empty);
    }
    
    protected override void RemoveItem(int index)
    {
        base.RemoveItem(index);
        OnSectionRemoved(EventArgs.Empty);
    }
    
    public new void Add(T item)
    {
        base.Add(item);
        OnSectionAdded(EventArgs.Empty);
    }
    public new bool Remove(T item)
    {
        bool ok = base.Remove(item);
        OnSectionRemoved(EventArgs.Empty);
        return ok;
    }
    
    protected override void ClearItems()
    {
        base.ClearItems();
    }
    
    protected virtual void OnSectionRemoved(EventArgs e)
    {
        EventHandler handler = this.ItemRemoved;
        if (handler != null)
        {
            handler(this, e);
        }
    }
    
    protected virtual void OnSectionAdded(EventArgs e)
    {
        EventHandler handler = this.ItemAdded;
        if (handler != null)
        {
            handler(this, e);
        }
    }
    

    }

Ответы [ 3 ]

8 голосов
/ 15 марта 2012

Вы можете использовать ObservableCollection<T> для этой цели. Не нужно писать самому.

Кроме того: при создании подкласса Collection<T> достаточно переопределить защищенные виртуальные методы. Все другие открытые методы будут вызывать их.
Если вы дополнительно скрываете не виртуальные, как вы, события могут запускаться несколько раз (и в вашем случае при очистке коллекции событие не будет запускаться).

2 голосов
/ 15 марта 2012

Нечто подобное уже существует, посмотрите на ObservableCollection<T>.

1 голос
/ 15 марта 2012

Существует ObservableCollection , поставляемая с .NET 4.0. Событие CollectionChanged предоставляет подробную информацию о том, что было изменено, добавлено или удалено.

...