简析SilverLight的List<T>、ObservableCollection<T>和INotifyPropertyChanged的异同

简介: 转自http://www.cnblogs.com/888h/archive/2010/12/26/1917269.html   大家在使用Silverlight开发的过程中,一定遇到过集合List、ObservableCollection和接口INotifyPropertyChanged,特别是集合List、ObservableCollection会经常遇到,但是大家有没有想到过他们之间的区别吗?大家一定知道在引用WCF的时候,系统默认使用的集合类型为ObservableCollection。

转自http://www.cnblogs.com/888h/archive/2010/12/26/1917269.html

   大家在使用Silverlight开发的过程中,一定遇到过集合List<T>、ObservableCollection<T>和接口INotifyPropertyChanged,特别是集合List<T>、ObservableCollection<T>会经常遇到,但是大家有没有想到过他们之间的区别吗?大家一定知道在引用WCF的时候,系统默认使用的集合类型为ObservableCollection<T>。

  那么下面我就简单的介绍一下他们三者之间的异同之处。

  List<T>

  List<T>代表的是强类型的Ojbect集合,可以通过索引访问并且提供了查找、排序以及操作此集合的方法。List<T>基本上和ArrayList相同,它用数组的方式实现了接口IList<T>并且他的大小可以根据需要来自动增加。

  

             图1 List<T>

  List<T>的缺点

  在使用ASP.NET开发时,我们简单的使用DataSource和DataBind来绑定数据,但是在SilverLight中就没有那么简单了。在ASP.NET中,绑定操作只是单向的。绑定操作一旦完成如果再想改变值的话,你必须得弹出一个已经赋值需要修改的对话框或者直接在表单上修改,最后再调用方法DataBind,这样的操作特别的麻烦。

 

      图2 List<T>实例

  上面显示的图片是一个简单的例子。后台的集合List在增加、修改、删除数据的时候,而UI层(DataGrid)的数据没有跟着改变。这就是List<T>的缺点。

  ObservableCollection<T>

  ObservableCollection是动态数据集合并且当集合中新增、修改或者删除项目时,或者集合被刷新时,都有通知机制(通过实现接口INotifyCollectionChanged)。在SilverLight中,引用WCF服务时,默认的集合类型就是ObservableCollection。

                图3 ObservableCollection<T>

  ObservableCollection<T>的缺点

  当集合中的属性中改变时没有提供任何的通知机制。

  

    图4 ObservableCollection<T>实例

  上面的图片是一个简单的例子,在程序运行的过程中,通过新增、删除或者改变ObservableCollection集合中的数据时,只有新增和删除数据时,UI集合(DataGrid)中的数据才改变。 但是在修改集合中已经存在的数据时UI层的数据却不能改变。

  

 INotifyPropertyChanged 

  

              图5 INotifyPropertyChanged 

  INotifyPropertyChanged不是集合,只是一个接口。在类中提供一个事件PropertyChanged,当属性的值发生改变时通知客户端。如果对象的状态发生改变时(新增、修改、删除)将触发事件PropertyChange指向那些已经发生改变的集合。

  

    图6 INotifyPropertyChanged实例

  INotifyPropertyChanged可以和所有类型的集合一块使用,比如List<T>,ObservableCollection<T>等等,下面的代码就是使用了INotifyPropertyChanged

 

代码
   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 " ); } 
    }

    
//  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>、ObservableCollection<T>和INotifyPropertyChanged简单的解析,特别是在MVVM架构中非常的有用。

目录
相关文章
|
6天前
|
存储 安全 Java
java集合框架及其特点(List、Set、Queue、Map)
java集合框架及其特点(List、Set、Queue、Map)
|
6天前
|
存储 安全 算法
Java一分钟之-Java集合框架入门:List接口与ArrayList
【5月更文挑战第10天】本文介绍了Java集合框架中的`List`接口和`ArrayList`实现类。`List`是有序集合,支持元素重复并能按索引访问。核心方法包括添加、删除、获取和设置元素。`ArrayList`基于动态数组,提供高效随机访问和自动扩容,但非线程安全。文章讨论了三个常见问题:索引越界、遍历时修改集合和并发修改,并给出避免策略。通过示例代码展示了基本操作和安全遍历删除。理解并正确使用`List`和`ArrayList`能提升程序效率和稳定性。
12 0
|
6天前
|
存储 安全 Java
【JAVA基础篇教学】第八篇:Java中List详解说明
【JAVA基础篇教学】第八篇:Java中List详解说明
|
6天前
|
存储 安全 Java
Java容器类List、ArrayList、Vector及map、HashTable、HashMap
Java容器类List、ArrayList、Vector及map、HashTable、HashMap
|
6天前
|
Java API
【亮剑】三种有效的方法来删除List中的重复元素Java的List
【4月更文挑战第30天】本文介绍了三种Java中删除List重复元素的方法:1) 使用HashSet,借助其不允许重复值的特性;2) 利用Java 8 Stream API的distinct()方法;3) 对自定义对象重写equals()和hashCode()。每种方法都附带了代码示例,帮助理解和应用。
|
6天前
|
Java
Java中拷贝list数组如何实现
Java中拷贝list数组如何实现
13 0
|
6天前
|
存储 Java API
java集合Collection(List)和泛型
java集合Collection(List)和泛型
|
6天前
|
Java
list集合 使用java8同一列表获取前一条的数据放到当前对象中
list集合 使用java8同一列表获取前一条的数据放到当前对象中
|
6天前
|
存储 安全 Java
Java集合详解(List、Map、Set)
Java集合详解(List、Map、Set)
34 4