Implementing INotifyCollectionChanged interface

libi picture libi · Dec 24, 2010 · Viewed 11.1k times · Source

I need to implement a collection with special capabilities. In addition, I want to bind this collection to a ListView, Therefore I ended up with the next code (I omitted some methods to make it shorter here in the forum):

public class myCollection<T> : INotifyCollectionChanged
{
    private Collection<T> collection = new Collection<T>();
    public event NotifyCollectionChangedEventHandler CollectionChanged;

    public void Add(T item)
    {
        collection.Insert(collection.Count, item);
        OnCollectionChange(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item));
    }

    protected virtual void OnCollectionChange(NotifyCollectionChangedEventArgs e)
    {
        if (CollectionChanged != null)
            CollectionChanged(this, e);
    }
}

I wanted to test it with a simple data class:

public class Person
{
    public string GivenName { get; set; }
    public string SurName { get; set; }
}

So I created an instance of myCollection class as follows:

myCollection<Person> _PersonCollection = new myCollection<Person>();
public myCollection<Person> PersonCollection
{ get { return _PersonCollection; } }

The problem is that the ListView does not update when the collection updates although I implemented the INotifyCollectionChanged interface.

I know that my binding is fine (in XAML) because when I use the ObservableCollecion class instead of myCollecion class like this:

 ObservableCollection<Person> _PersonCollection = new ObservableCollection<Person>();
    public ObservableCollection<Person> PersonCollection
    { get { return _PersonCollection; } }

the ListView updates

What is the problem?

Answer

devdigital picture devdigital · Dec 24, 2010

In order for your collection to be consumed, you should implement IEnumerable and IEnumerator too. Although, you're probably better off subclassing ObservableCollection<T>