Difference between ObservableCollection and BindingList

.net, c#, observablecollection, wpf, wpf-4.0

Solution

An `ObservableCollection` can be updated from UI exactly like any collection. The true difference is rather straightforward:

`ObservableCollection<T>` implements `INotifyCollectionChanged` which provides notification when the collection is changed (you guessed ^^) It allows the binding engine to update the UI when the `ObservableCollection` is updated.

However, `BindingList<T>` implements `IBindingList`.

`IBindingList` provides notification on collection changes, but not only that. It provides a whole bunch of functionality which can be used by the UI to provide a lot more things than only UI updates according to changes, like:

- Sorting

- Searching

- Add through factory (AddNew member function).

- Readonly list (CanEdit property)

All these functionalities are not available in `ObservableCollection<T>`

Another difference is that `BindingList` relays item change notifications when its items implement `INotifyPropertyChanged`. If an item raises a `PropertyChanged` event, the `BindingList` will receive it an raises a `ListChangedEvent` with `ListChangedType.ItemChanged` and `OldIndex=NewIndex` (if an item was replaced, `OldIndex=-1`). `ObservableCollection` doesn't relay item notifications.

Note that in Silverlight, `BindingList` is not available as an option: You can however use `ObservableCollection`s and `ICollectionView` (and `IPagedCollectionView` if I remember well).

Problem

I want to know the difference between `ObservableCollection` and `BindingList` because I've used both to notify for any add/delete change in Source, but I actually do not know when to prefer one over the other. Why would I choose one of the following over the other? ``` ObservableCollection<Employee> lstEmp = new ObservableCollection<Employee>(); ``` or ``` BindingList<Employee> lstEmp = new BindingList<Employee>(); ```

Original source