tags:

views:

678

answers:

2

What is the purpose of ObservableCollection raising a PropertyChange of "Item[]"?

Is this something I should be doing if I have a class that implements INotifyCollectionChanged?

Do WPF controls use this PropertyChange of "Item[]" somehow?

A: 

Yes WPF and Silverlight controls use the PropertyChange event to update UI controls. This allows things like ListView's or DataGrid's to automatically update in response to their bound ObservableCollection - or other collection implementing INotifyCollectionChanged - changes.

Edit: As far as implementation goes you generally shouldn't need to implement your own collection so don't need to worrk about INotifyCollectionChanged. For your classes that will be used in the ObservableCollection you need to implement INotifyPropertyChanged. This allows your objects to fire the PropertyChanged event whenever they are updated which will allow your UI control to automatically show the change.

sipwiz
I am confused. You say that WPF uses 'PropertyChange of "Item[]"', but I should implement 'CollectionChanged'.
jyoung
+1  A: 

ObservableCollection implements both INotifyCollectionChanged and INotifyPropertyChanged.

INotifyPropertyChanged is used to indicate that a property of the ObservableCollection has changed, like the number of its elements ("Count") or an element accessible through the collection's indexer ("Item[]"). Additionally, ObservableCollection implements INotifyCollectionChanged to indicate which element has changed exactly and how.

Have a look at the Mono implementation of ObservableCollection to see what the ObservableCollection does exactly. For example, here is the InsertItem method:

protected override void InsertItem (int index, T item)
{
    CheckReentrancy ();

    base.InsertItem (index, item);

    OnCollectionChanged (new NotifyCollectionChangedEventArgs (
        NotifyCollectionChangedAction.Add, item, index));
    OnPropertyChanged (new PropertyChangedEventArgs ("Count"));
    OnPropertyChanged (new PropertyChangedEventArgs ("Item[]"));
}

If you want to implement your own ObservableCollection-like collection class, it seems the proper way to implement both INotifyCollectionChanged and INotifyPropertyChanged.

dtb