jyoung
jyoung

Reputation: 5181

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

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?

Upvotes: 5

Views: 2710

Answers (2)

sipsorcery
sipsorcery

Reputation: 30714

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.

Upvotes: 0

dtb
dtb

Reputation: 217341

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.

Upvotes: 5

Related Questions