Introduction
This article describes the basic understanding between List
, ObservableCollection
and INotifyPropertyChanged
.
Difference between List<T>, ObservableCollection<T> and INotifyPropertyChanged
List<T>
It represents a strongly typed list of objects that can be accessed by index. It provides methods to search, sort, and manipulate lists. The List<T>
class is the generic equivalent of the ArrayList
class. It implements the IList<T>
generic interface using an array whose size is dynamically increased as required.
Drawbacks
In ASP.NET, we simply use DataSource
and DataBind()
to bind the data, but in Silverlight it is slightly different. Databinding in ASP.NET is done in a stateless way - once that binding operation is completed, it's a done deal and if you want to change anything, you have to manipulate the underlying controls that were created as a result of the data binding, or else change the underlying data objects and call DataBind()
again. That’s what we are used to – but it’s not a good practice.
In the sample application, the values in the list are added, removed and changed during runtime in the code behind. The changes in the list will not be updated to the UI (Datagrid
).
ObservableCollection<T>
ObservableCollection
is a generic dynamic data collection that provides notifications (using an interface "INotifyCollectionChanged
") when items get added, removed, or when the whole collection is refreshed.
Note: WCF service proxy class in Silverlight will use this type of collection by default.
Drawbacks
It does not provide any notifications when any property in the collection is changed.
In the sample application, the values in the observable collection are added, removed and changed during runtime in the code behind. The operations (adding and removing an item) in the observable collection will be updated to the UI (Datagrid
). But any change in the existing item will not be updated to the UI.
INotifyPropertyChanged
INotifyPropertyChanged
is not a collection, it’s an interface used in the data object classes to provide PropertyChanged
notification to clients when any property value gets changed. This will allow you to raise PropertyChanged
event whenever the state of the object changes (Added, Removed, and Modified) to the point where you want to notify the underlying collection or container that the state has changed.
INotifyPropertyChanged
is compatible on all type of collections like List<T>
, ObservableCollection<T>
, etc. The code snippet which uses INotifyPropertyChanged
is shown below:
public class UserNPC:INotifyPropertyChanged
{
private string name;
public string Name {
get { return name; }
set { name = value; onPropertyChanged(this, "Name"); }
}
public int grade;
public int Grade {
get { return grade; }
set { grade = value; onPropertyChanged(this, "Grade"); }
}
public event PropertyChangedEventHandler PropertyChanged;
private void onPropertyChanged(object sender, string propertyName)
{
if (this.PropertyChanged != null)
{
PropertyChanged(sender, new PropertyChangedEventArgs(propertyName));
}
}
}
In the above code snippet, whenever a value is set to a property, the method “onPropertyChanged
” will be called which in turn raises the PropertyChanged
event.
History
- 22nd September, 2009: Initial post