惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V2EX - 技术
V2EX - 技术
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Threat Research - Cisco Blogs
T
The Exploit Database - CXSecurity.com
S
Schneier on Security
S
Securelist
P
Privacy & Cybersecurity Law Blog
Scott Helme
Scott Helme
T
Threatpost
C
Cybersecurity and Infrastructure Security Agency CISA
L
LINUX DO - 热门话题
Cyberwarzone
Cyberwarzone
Cisco Talos Blog
Cisco Talos Blog
量子位
博客园 - Franky
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Latest news
Latest news
T
Troy Hunt's Blog
N
News | PayPal Newsroom
Google Online Security Blog
Google Online Security Blog
Apple Machine Learning Research
Apple Machine Learning Research
N
Netflix TechBlog - Medium
小众软件
小众软件
P
Palo Alto Networks Blog
Spread Privacy
Spread Privacy
C
Cyber Attacks, Cyber Crime and Cyber Security
C
Check Point Blog
aimingoo的专栏
aimingoo的专栏
WordPress大学
WordPress大学
L
Lohrmann on Cybersecurity
L
LINUX DO - 最新话题
D
Darknet – Hacking Tools, Hacker News & Cyber Security
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
The Last Watchdog
The Last Watchdog
S
Security @ Cisco Blogs
P
Privacy International News Feed
Last Week in AI
Last Week in AI
Microsoft Security Blog
Microsoft Security Blog
T
Tailwind CSS Blog
博客园_首页
云风的 BLOG
云风的 BLOG
V
Vulnerabilities – Threatpost
D
DataBreaches.Net
Recent Announcements
Recent Announcements
酷 壳 – CoolShell
酷 壳 – CoolShell
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
罗磊的独立博客
Engineering at Meta
Engineering at Meta
Forbes - Security
Forbes - Security
T
Tenable Blog

博客园 - 天神一

Windows 8的本地化应用程序清单 代码滑动panorama-即程序中设置SelectedIndex WP7开发 Sqlite数据库的使用 解决Unable open the database WP7 真机调试PhotoChooserTask和CameraCaptureTask 解决windows8不能安装ZUNE的问题 软件概要设计 AutoResetEvent详解 解决VS2008 调试启动特别慢 微软WP7本地数据库之Sqlite编程技巧(转) 桥接模式的简单分析 代码的“门面”——模式系列谈之Facade模式(转) SilverLight4:在MVVM架构下实现模式窗口 MVVM架构的简单解析 在MVVM架构下,把EventArgs绑定到Command上【翻译】 XNA 4.0新书:初学者很好的书籍 SilverLight:在MVVM中实现多事件 SilverLight:使用MVVM实现View层在程序运行时自动生成控件并且取得其值 (翻译)在MVVM模式中打开子窗体(Child Window) Windows Phone 7 完全版电子书可以免费下载了
简析SilverLight的List<T>、ObservableCollection<T>和INotifyPropertyChanged的异同
天神一 · 2010-12-26 · via 博客园 - 天神一

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