An observable collection is an enhanced variant of a plain collection that notifies
  interested parties of any changes, such as items being added or removed. This is useful,
  amongst other things, if you want to keep a look-up table in sync or immediately reflect
  changes to a collection in the user interface. .NET provides support for such
  collections through its System.Collections.ObjectModel.ObservableCollection<T>
  class, which implements the INotifyCollectionChanged interface:
  
  Confusingly, this class, named like a collection, actually is a list. It’s not
  as big a problem as it was for the read-only collections
  because the observable collections don’t wrap an existing collection, but the inconsistent
  naming still irks me. The INotifyCollectionChanged interface also is not type-safe,
  requiring a downcast in the event subscribers.
So I rolled out my own set of observable collections complete with a type-safe interface:
ObservableList<T> and ObservableCollection<T>
  The ObservableList<T> is largely equal to .NET’s own
  ObservableCollection<T>, but implements my
  IObservableCollection<T> interface in addition to the standard
  INotifyCollectionChanged interface. As explained above, my own
  ObservableCollection<T> actually is a collection and doesn’t support
  random access.
  
ObservableDictionary<K, T> and ObservableSet<K>
  There have been moments when an ObservableDictionary<K, T> would have been
  a great thing to have. So I eventually added such a class to my extended collections as well:
  
  Nothing spectacular, as all these really do is send change notifications with a
  KeyValuePair<K, T> or just the key K respectively,
  but I’m glad to have them in my toolbox in the few cases where I actually need them.