List<T>、ObservableCollection<T>和接口INotifyPropertyChanged

大家在使用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架构中非常的有用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值