对Silverlight中ObservableCollection自己的一点理解 .

2023-10-28 06:08

本文主要是介绍对Silverlight中ObservableCollection自己的一点理解 .,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本篇学习了ObservableCollection<T>相关知识,因为在项目开发中我碰到一些问题,后来发现时我的理解偏差!所以做下笔记!

 

(一)代码:

 
  1.  
    [c-sharp] view plain copy print ?
    1. using System;  
    2. using System.Collections.Generic;  
    3. using System.Linq;  
    4. using System.Net;  
    5. using System.Windows;  
    6. using System.Windows.Controls;  
    7. using System.Windows.Documents;  
    8. using System.Windows.Input;  
    9. using System.Windows.Media;  
    10. using System.Windows.Media.Animation;  
    11. using System.Windows.Shapes;  
    12. //添加命名空间   
    13. using System.Collections.ObjectModel;  
    14. using System.ComponentModel;  
    15.   
    16. namespace CatalogTest  
    17. {  
    18.     public partial class ObservableCollectionVSList : UserControl  
    19.     {  
    20.         ObservableCollection<Student> students = new ObservableCollection<Student>();  
    21.         //List<Student> students = new List<Student>();  
    22.         Student selectedStudent = null;  
    23.   
    24.         public ObservableCollectionVSList()  
    25.         {  
    26.             InitializeComponent();  
    27.             this.Loaded += new RoutedEventHandler(ObservableCollectionVSList_Loaded);  
    28.         }  
    29.   
    30.         void ObservableCollectionVSList_Loaded(object sender, RoutedEventArgs e)  
    31.         {  
    32.             Student student1 = new Student() { StudentID = "001", StudentName = "张三" };  
    33.             Student student2 = new Student() { StudentID = "002", StudentName = "李四" };  
    34.             Student student3 = new Student() { StudentID = "003", StudentName = "王五" };  
    35.             students.Add(student1);  
    36.             students.Add(student2);  
    37.             students.Add(student3);  
    38.             //绑定   
    39.             listBox1.ItemsSource = students;  
    40.             listBox1.DisplayMemberPath = "StudentName";  
    41.             //注册选择项事件   
    42.             this.listBox1.SelectionChanged += new SelectionChangedEventHandler(listBox1_SelectionChanged);             
    43.   
    44.         }        
    45.   
    46.         void listBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)  
    47.         {              
    48.             selectedStudent = this.listBox1.SelectedItem as Student;              
    49.         }  
    50.   
    51.         //删除   
    52.         private void btnDel_Click(object sender, RoutedEventArgs e)  
    53.         {  
    54.             if (selectedStudent != null)  
    55.             {  
    56.                 students.Remove(selectedStudent);  
    57.             }            
    58.   
    59.         }  
    60.         //修改   
    61.         private void btnEdit_Click(object sender, RoutedEventArgs e)  
    62.         {  
    63.             if (selectedStudent != null)  
    64.             {  
    65.                 int myIndex = students.IndexOf(selectedStudent);  
    66.                 students[myIndex].StudentName = "我改名了!";  
    67.             }  
    68.         }  
    69.         //添加   
    70.         private void btnAdd_Click(object sender, RoutedEventArgs e)  
    71.         {  
    72.             Student student = new Student() { StudentID="009",StudentName="Joetao"};             
    73.             students.Add(student);  
    74.         }  
    75.     }  
    76.     public class Student  
    77.     {  
    78.         public string  StudentID { getset; }  
    79.         public string  StudentName { getset; }  
    80.     }     
    81.   
    82.     //分别采用 ObservableCollection<Student>与List<Student>作为绑定数据源  
    83.     //当我们用List<T>作为数据源绑定UI控件时:当做增删改操作来修改students绑定数据源时,数据源都不能通知UI更新。  
    84.     //当我们用ObservableCollection<T>作为数据绑定UI控件时:当做增删改操作来修改students绑定数据源时,Add()和Remove()操作修改的数据源能通知UI更新,而改操作不能更新UI.  
    85.     //                               //这一点正说明了MSDN上对ObservableCollection<T>类介绍:"表示一个动态数据集合,在添加项、移除项或刷新整个列表时,此集合将提供通知。"  
    86.      
    87.     //我在处理这个问题理解偏差:   
    88.     //在一开始的时候我对这句话:“实现您自己的集合之前,应考虑使用 ObservableCollection<T> 类,该类具有 INotifyCollectionChanged 和 INotifyPropertyChanged 的内置实现。“  
    89.     //被我理解为了只要用了ObservableCollection<T>,这个类集合以及类集合中的所有成员属性就具有更改通知的功能,这个理解是错误。ObservableCollection<T>只是针对T类型而言,并非给予了  
    90.     //类成员属性更改通知的功能,要想类成员属性具有更改UI功能还得让类继承INotifyPropertyChanged接口,并用 (NotifyCollectionChangedEventArgs) 的事件数据报告有关集合更改的特性的信息  
    91.     }  

(二)实现类成员更改通知UI:

          要想实现类属性值修改,我们必须修改Student类,如下:

 

 

  

[c-sharp] view plain copy print ?
  1. public class Student : INotifyPropertyChanged  
  2. {  
  3.     private string studentID;  
  4.     public string StudentID  
  5.     {  
  6.         get { return studentID; }  
  7.         set  
  8.         {  
  9.             studentID = value;  
  10.             NotifyPropertyChange("StudentID");  
  11.         }  
  12.     }  
  13.     private string studentName;  
  14.     public string StudentName  
  15.     {  
  16.         get { return studentName; }  
  17.         set  
  18.         {  
  19.             studentName = value;  
  20.             NotifyPropertyChange("StudentName");  
  21.         }  
  22.     }  
  23.   
  24.     public event PropertyChangedEventHandler PropertyChanged;  
  25.     private void NotifyPropertyChange(string propertyName)  
  26.     {  
  27.         if (PropertyChanged != null)  
  28.         {  
  29.             PropertyChanged(thisnew PropertyChangedEventArgs(propertyName));  
  30.         }  
  31.     }  
  32.   
  33. }  

(三)总结:

          本篇学习了 ObservableCollection<T>与List<T>作为绑定数据源的不同,实例充分说明了 ObservableCollection<T>在Silverlight中作为绑定数据源的优势! 并例举了自己最初对ObservableCollection<T>的误解。并说明了怎样实现类属性成员的修改更改UI的实现方法!这里绑定可以是OneTime,OneWay,TwoWay.

这篇关于对Silverlight中ObservableCollection自己的一点理解 .的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/291216

相关文章

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

深入理解Redis大key的危害及解决方案

《深入理解Redis大key的危害及解决方案》本文主要介绍了深入理解Redis大key的危害及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、背景二、什么是大key三、大key评价标准四、大key 产生的原因与场景五、大key影响与危

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

如何通俗理解注意力机制?

1、注意力机制(Attention Mechanism)是机器学习和深度学习中一种模拟人类注意力的方法,用于提高模型在处理大量信息时的效率和效果。通俗地理解,它就像是在一堆信息中找到最重要的部分,把注意力集中在这些关键点上,从而更好地完成任务。以下是几个简单的比喻来帮助理解注意力机制: 2、寻找重点:想象一下,你在阅读一篇文章的时候,有些段落特别重要,你会特别注意这些段落,反复阅读,而对其他部分

深入理解数据库的 4NF:多值依赖与消除数据异常

在数据库设计中, "范式" 是一个常常被提到的重要概念。许多初学者在学习数据库设计时,经常听到第一范式(1NF)、第二范式(2NF)、第三范式(3NF)以及 BCNF(Boyce-Codd范式)。这些范式都旨在通过消除数据冗余和异常来优化数据库结构。然而,当我们谈到 4NF(第四范式)时,事情变得更加复杂。本文将带你深入了解 多值依赖 和 4NF,帮助你在数据库设计中消除更高级别的异常。 什么是