对Silverlight中ObservableCollection自己的一点理解
2010-11-09 00:47
337 查看
本篇学习了ObservableCollection<T>相关知识,因为在项目开发中我碰到一些问题,后来发现时我的理解偏差!所以做下笔记!
(一)代码:
(二)实现类成员更改通知UI:
要想实现类属性值修改,我们必须修改Student类,如下:
(三)总结:
本篇学习了 ObservableCollection<T>与List<T>作为绑定数据源的不同,实例充分说明了 ObservableCollection<T>在Silverlight中作为绑定数据源的优势! 并例举了自己最初对ObservableCollection<T>的误解。并说明了怎样实现类属性成员的修改更改UI的实现方法!这里绑定可以是OneTime,OneWay,TwoWay.具体 理解可以看我的另一篇文章Silverlight中OneTime,OneWay,TwoWay及INotifyPropertyChanged 接口的理解
(一)代码:
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; //添加命名空间 using System.Collections.ObjectModel; using System.ComponentModel; namespace CatalogTest { public partial class ObservableCollectionVSList : UserControl { ObservableCollection<Student> students = new ObservableCollection<Student>(); //List<Student> students = new List<Student>(); Student selectedStudent = null; public ObservableCollectionVSList() { InitializeComponent(); this.Loaded += new RoutedEventHandler(ObservableCollectionVSList_Loaded); } void ObservableCollectionVSList_Loaded(object sender, RoutedEventArgs e) { Student student1 = new Student() { StudentID = "001", StudentName = "张三" }; Student student2 = new Student() { StudentID = "002", StudentName = "李四" }; Student student3 = new Student() { StudentID = "003", StudentName = "王五" }; students.Add(student1); students.Add(student2); students.Add(student3); //绑定 listBox1.ItemsSource = students; listBox1.DisplayMemberPath = "StudentName"; //注册选择项事件 this.listBox1.SelectionChanged += new SelectionChangedEventHandler(listBox1_SelectionChanged); } void listBox1_SelectionChanged(object sender, SelectionChangedEventArgs e) { selectedStudent = this.listBox1.SelectedItem as Student; } //删除 private void btnDel_Click(object sender, RoutedEventArgs e) { if (selectedStudent != null) { students.Remove(selectedStudent); } } //修改 private void btnEdit_Click(object sender, RoutedEventArgs e) { if (selectedStudent != null) { int myIndex = students.IndexOf(selectedStudent); students[myIndex].StudentName = "我改名了!"; } } //添加 private void btnAdd_Click(object sender, RoutedEventArgs e) { Student student = new Student() { StudentID="009",StudentName="Joetao"}; students.Add(student); } } public class Student { public string StudentID { get; set; } public string StudentName { get; set; } } //分别采用 ObservableCollection<Student>与List<Student>作为绑定数据源 //当我们用List<T>作为数据源绑定UI控件时:当做增删改操作来修改students绑定数据源时,数据源都不能通知UI更新。 //当我们用ObservableCollection<T>作为数据绑定UI控件时:当做增删改操作来修改students绑定数据源时,Add()和Remove()操作修改的数据源能通知UI更新,而改操作不能更新UI. // //这一点正说明了MSDN上对ObservableCollection<T>类介绍:"表示一个动态数据集合,在添加项、移除项或刷新整个列表时,此集合将提供通知。" //我在处理这个问题理解偏差: //在一开始的时候我对这句话:“实现您自己的集合之前,应考虑使用 ObservableCollection<T> 类,该类具有 INotifyCollectionChanged 和 INotifyPropertyChanged 的内置实现。“ //被我理解为了只要用了ObservableCollection<T>,这个类集合以及类集合中的所有成员属性就具有更改通知的功能,这个理解是错误。ObservableCollection<T>只是针对T类型而言,并非给予了 //类成员属性更改通知的功能,要想类成员属性具有更改UI功能还得让类继承INotifyPropertyChanged接口,并用 (NotifyCollectionChangedEventArgs) 的事件数据报告有关集合更改的特性的信息 }
(二)实现类成员更改通知UI:
要想实现类属性值修改,我们必须修改Student类,如下:
public class Student : INotifyPropertyChanged { private string studentID; public string StudentID { get { return studentID; } set { studentID = value; NotifyPropertyChange("StudentID"); } } private string studentName; public string StudentName { get { return studentName; } set { studentName = value; NotifyPropertyChange("StudentName"); } } public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChange(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } }
(三)总结:
本篇学习了 ObservableCollection<T>与List<T>作为绑定数据源的不同,实例充分说明了 ObservableCollection<T>在Silverlight中作为绑定数据源的优势! 并例举了自己最初对ObservableCollection<T>的误解。并说明了怎样实现类属性成员的修改更改UI的实现方法!这里绑定可以是OneTime,OneWay,TwoWay.具体 理解可以看我的另一篇文章Silverlight中OneTime,OneWay,TwoWay及INotifyPropertyChanged 接口的理解
相关文章推荐
- 对Silverlight中ObservableCollection自己的一点理解 .
- 关于spring mvc的一点自己的理解
- CountDownLatch 自己的一点理解
- 自己对C语言中scanf语句接受字符串的一点理解
- 自己对权限表的一点理解
- HADOOP之NAMENODE元数据管理(一点理解记下来只是为了帮助自己记忆)
- 编程之美1.2中国象棋将帅问题——转载+自己的一点理解
- Java's Interface自己的一点理解
- 自己在学习Mybits的时候理解的一点sql注入的知识,以及处理的方法!
- Mat类型中的CV_8UC3、CV_32FC3以及对应的迭代器模板参数Vec3b,Vec3f的一点自己的理解
- 自己对PretranslateMessage的一点理解
- 谈谈自己对随机森林(Random Forest)的一点理解以及代码注释~
- JSON的一点自己的理解
- 黑马程序员--Io流,(含自己的一点理解,与图解)
- 自己关于Intent的一点大致的理解
- 自己对shell,终端的一点理解
- 关于volley的一点自己的理解
- 自己理解的一点生活态度(源于技术,用于生活)
- 百度UNIT使用的步骤与自己的一点简单理解(上)
- 摘要:我们经常会用到递归函数,但是如果递归深度太大时,往往导致栈溢出。而递归深度往往不太容易把握,所以比较安全一点的做法就是:用循环代替递归。文章最后的原文里面讲了如何用10步实现这个过程,相当精彩。本文翻译了这篇文章,并加了自己的一点注释和理解。