SilverLight的List<T>、ObservableCollection<T>和INotifyPropertyChanged
2011-07-20 15:57 suzh 阅读(575) 评论(0) 编辑 收藏 举报 大家在使用Silverlight开发的过程中,一定遇到过集合List
那么下面我就简单的介绍一下他们三者之间的异同之处。
List<T>
List<T>
图1 List<T>
List<T>的缺点
在使用ASP.NET开发时,我们简单的使用DataSource和DataBind来绑定数据,但是在SilverLight中就没有那么简单了。在ASP.NET中,绑定操作只是单向的。绑定操作一旦完成如果再想改变值的话,你必须得弹出一个已经赋值需要修改的对话框或者直接在表单上修改,最后再调用方法DataBind,这样的操作特别的麻烦。
图2 List<T>实例
上面显示的图片是一个简单的例子。后台的集合List在增加、修改、删除数据的时候,而UI层(DataGrid)的数据没有跟着改变。这就是List
ObservableCollection
ObservableCollection是动态数据集合并且当集合中新增、修改或者删除项目时,或者集合被刷新时,都有通知机制(通过实现接口INotifyCollectionChanged)。在SilverLight中,引用WCF服务时,默认的集合类型就是ObservableCollection。
图3 ObservableCollection
ObservableCollection
当集合中的属性中改变时没有提供任何的通知机制。
图4 ObservableCollection
上面的图片是一个简单的例子,在程序运行的过程中,通过新增、删除或者改变ObservableCollection集合中的数据时,只有新增和删除数据时,UI集合(DataGrid)中的数据才改变。 但是在修改集合中已经存在的数据时UI层的数据却不能改变。
INotifyPropertyChanged
图5 INotifyPropertyChanged
INotifyPropertyChanged不是集合,只是一个接口。在类中提供一个事件PropertyChanged,当属性的值发生改变时通知客户端。如果对象的状态发生改变时(新增、修改、删除)将触发事件PropertyChange指向那些已经发生改变的集合。
图6 INotifyPropertyChanged实例
INotifyPropertyChanged可以和所有类型的集合一块使用,比如List
{
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"); }
}
// Declare the PropertyChanged event
public event PropertyChangedEventHandler PropertyChanged;
// OnPropertyChanged will raise the PropertyChanged event passing the
// source property that is being updated.
private void onPropertyChanged(object sender, string propertyName)
{
if (this.PropertyChanged != null)
{
PropertyChanged(sender, new PropertyChangedEventArgs(propertyName));
}
}
}
通过上面的简单程序中可以看出,当向一个属性赋值时,方法OnPropertyChanged将被调用并且触发事件PropertyChanged.
以上就是简单的对List<T>
转自:http://www.cnblogs.com/888h/archive/2010/12/26/1917269.html