1. 其实一直不知道INotifyPropertyChanged这个接口中PropertyChanged事件是什么时候有值的,因为在使用的时候,只要按步骤来就可以,因为我自己并没有对这个事件赋值,所以很好奇,网上看到一篇文章,说是观察者模式,但是也是自己给赋的值,真不知微软是
    怎么实现的。下面是原文,来自:http://frankdzu.blog.sohu.com/117654536.html
  2.  
  3. 普通观察者模式存在的问题
  4.  
  5. 我们都知道观察者模式的优点,可以在属性发生改变时,来监听一个实现好了的事件,这样可以帮助来异步处理许多的事情,可是在观察者模式中,一般都是针对于实体来进行封装操作,可大多数的监听过程就需要写在实体的内部了,这样大大影响了实体封装的原子性,如果想实现什么监听事件,都需要在实体层进行更改,这另人太不悦了```
  6.  
  7. 不过,可以通过代理的方式,让实体里面监听的时候执行这个代理就好了,代理的功能由外部仍进来,不过这样也是破坏了实体本身,需要由外部来传递参数,这样对于底层开发人员来说,也不是很愉快的事情。
  8.  
  9. 实现 INotifyPropertyChanged
  10.  
  11. 怎么样才能既实现了监听,也不破坏实体的特性,让监听的事件外露呢?所以通过实现 INotifyPropertyChanged来解决这一问题。
  12.  
  13. 原型:event PropertyChangedEventHandler PropertyChanged
  14.  
  15. 下面这个例子将详细说明用法:
  16.  
  17. using System;
  18.  
  19. using System.Collections.Generic;
  20.  
  21. using System.Text;
  22.  
  23. using System.ComponentModel;
  24.  
  25. namespace Demo
  26.  
  27. {
  28.  
  29. class Program
  30.  
  31. {
  32.  
  33. public static void Main(string[] args)
  34.  
  35. {
  36.  
  37. // 创建实例
  38.  
  39. DemoCustomer demoCustomer = DemoCustomer.CreateNewCustomer();
  40.  
  41. // 实现事件触发需要处理的事情
  42.  
  43. demoCustomer.PropertyChanged += new PropertyChangedEventHandler(demoCustomer_PropertyChanged);
  44.  
  45. // 更新值 引发事件
  46.  
  47. demoCustomer.PhoneNumber = "";
  48.  
  49. // 等待
  50.  
  51. Console.ReadLine();
  52.  
  53. }
  54.  
  55. static void demoCustomer_PropertyChanged(object sender, PropertyChangedEventArgs e)
  56.  
  57. {
  58.  
  59. // 获取被更改的属性名
  60.  
  61. Console.WriteLine(e.PropertyName);
  62.  
  63. // 获取最新更新的值
  64.  
  65. Console.WriteLine(((DemoCustomer)sender).PhoneNumber);
  66.  
  67. }
  68.  
  69. }
  70.  
  71. // 实现 INotifyPropertyChanged 接口 进行监听
  72.  
  73. public class DemoCustomer : INotifyPropertyChanged
  74.  
  75. {
  76.  
  77. // 默认的私有属性
  78.  
  79. private Guid idValue = Guid.NewGuid();
  80.  
  81. private string customerName = String.Empty;
  82.  
  83. private string companyNameValue = String.Empty;
  84.  
  85. private string phoneNumberValue = String.Empty;
  86.  
  87. /// <summary>
  88.  
  89. /// 在更改属性时引发的事件。(这个事件将被外露。)
  90.  
  91. /// </summary>
  92.  
  93. public event PropertyChangedEventHandler PropertyChanged;
  94.  
  95. private void NotifyPropertyChanged(String info)
  96.  
  97. {
  98.  
  99. if (PropertyChanged != null)
  100.  
  101. {
  102.  
  103. PropertyChanged(this, new PropertyChangedEventArgs(info));
  104.  
  105. }
  106.  
  107. }
  108.  
  109. // 默认的构造
  110.  
  111. private DemoCustomer()
  112.  
  113. {
  114.  
  115. customerName = "no data";
  116.  
  117. companyNameValue = "no data";
  118.  
  119. phoneNumberValue = "no data";
  120.  
  121. }
  122.  
  123. // 简单的工厂模式
  124.  
  125. public static DemoCustomer CreateNewCustomer()
  126.  
  127. {
  128.  
  129. return new DemoCustomer();
  130.  
  131. }
  132.  
  133. public Guid ID
  134.  
  135. {
  136.  
  137. get
  138.  
  139. {
  140.  
  141. return this.idValue;
  142.  
  143. }
  144.  
  145. }
  146.  
  147. public string CompanyName
  148.  
  149. {
  150.  
  151. get
  152.  
  153. {
  154.  
  155. return this.companyNameValue;
  156.  
  157. }
  158.  
  159. set
  160.  
  161. {
  162.  
  163. if (value != this.companyNameValue)
  164.  
  165. {
  166.  
  167. this.companyNameValue = value;
  168.  
  169. // 当发生改变时,那么就触发事件,传入触发的属性名
  170.  
  171. NotifyPropertyChanged("CompanyName");
  172.  
  173. }
  174.  
  175. }
  176.  
  177. }
  178.  
  179. public string PhoneNumber
  180.  
  181. {
  182.  
  183. get
  184.  
  185. {
  186.  
  187. return this.phoneNumberValue;
  188.  
  189. }
  190.  
  191. set
  192.  
  193. {
  194.  
  195. if (value != this.phoneNumberValue)
  196.  
  197. {
  198.  
  199. this.phoneNumberValue = value;
  200.  
  201. // 当发生改变时,那么就触发事件,传入触发的属性名
  202.  
  203. NotifyPropertyChanged("PhoneNumber");
  204.  
  205. }
  206.  
  207. }
  208.  
  209. }
  210.  
  211. }
  212.  
  213. }

观察者模式实现INotifyPropertyChanged的更多相关文章

  1. 【转】通过 INotifyPropertyChanged 实现观察者模式

    通过 INotifyPropertyChanged 实现观察者模式 原博客地址 http://frankdzu.blog.sohu.com/117654536.html 普通观察者模式存在的问题 我们 ...

  2. 通过 INotifyPropertyChanged 实现观察者模式

    INotifyPropertyChanged 它的作用:向客户端发出某一属性值已更改的通知. 当属性改变时,它可以通知客户端,并进行界面数据更新.而我们不用写很多复杂的代码来更新界面数据,这样可以做到 ...

  3. C#-INotifyPropertyChanged(解决数据绑定的界面刷新问题)

    最近做项目用到DataGridView,用它绑定数据源后,如果数据源中的数据修改无法及时刷新到控件上,必须切换单元格的焦点才能导致刷新显示新数值,通过查官方文档,用INotifyPropertyCha ...

  4. WPF学习总结1:INotifyPropertyChanged接口的作用

    在代码中经常见到这个接口,它里面有什么?它的作用是什么?它和依赖属性有什么关系? 下面就来总结回答这三个问题. 1.这个INotifyPropertyChanged接口里就一个PropertyChan ...

  5. 23种设计模式--观察者模式-Observer Pattern

    一.观察者模式的介绍      观察者模式从字面的意思上理解,肯定有两个对象一个是观察者,另外一个是被观察者,观察者模式就是当被观察者发生改变得时候发送通知给观察者,当然这个观察者可以是多个对象,在项 ...

  6. 谈谈JS的观察者模式(自定义事件)

    呼呼...前不久参加了一个笔试,里面有一到JS编程题,当时看着题目就蒙圈...后来研究了一下,原来就是所谓的观察者模式.就记下来...^_^ 题目 [附加题] 请实现下面的自定义事件 Event 对象 ...

  7. ObserverPattern(观察者模式)

    import java.util.ArrayList; import java.util.List; /** * 观察者模式 * @author TMAC-J * 牵一发而动全身来形容观察者模式在合适 ...

  8. java观察者模式

      像activeMQ等消息队列中,我们经常会使用发布订阅模式,但是你有没有想过,客户端时如何及时得到订阅的主题的信息?其实就里就用到了观察者模式.在软件系统中,当一个对象的行为依赖于另一个对象的状态 ...

  9. Backbone源码解析(六):观察者模式应用

    卤煮在大概一年前写过backbone的源码分析,里面讲的是对一些backbone框架的方法的讲解.这几天重新看了几遍backbone的源码,才发现之前对于它的理解不够深入,只关注了它的一些部分的细节和 ...

随机推荐

  1. STAD Parameters

    STAD related parameters:   1. stat/file  -- define the file name of the actual STAD content – defaul ...

  2. WMB代理无法正常启动时的解决方案。

     情况:执行了启动命令,查看状态的时候 还是停止..再启动,又说已经启动了..   解决方案:正常情况在hosts文件加一条记录:主机IP和hostname的映射关系就好了

  3. Java中的类加载器以及Tomcat的类加载机制

    在加载阶段,虚拟机需要完成以下三件事情: 1.通过一个类的全限定名来获取其定义的二进制字节流. 2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构. 3.在Java堆中生成一个代表这个类 ...

  4. TweenMax动画库学习(六)

    目录            TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)            Tw ...

  5. mysql中的if条件语句用法

    · IF(expr1,expr2,expr3) 如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),则 IF()的返回值为expr2;  ...

  6. 关于python多线程编程中join()和setDaemon()的一点儿探究

    关于python多线程编程中join()和setDaemon()的用法,这两天我看网上的资料看得头晕脑涨也没看懂,干脆就做一个实验来看看吧. 首先是编写实验的基础代码,创建一个名为MyThread的  ...

  7. 【ibatis】cachemodel、属性 及特殊配置

    http://www.cnblogs.com/13590/archive/2013/03/01/2938126.html <?xml version="1.0" encodi ...

  8. easy ui datagrid在没有数据时显示相关提示内容

    $(function () { $('#dg').datagrid({ fitColumns: true, url: 'product.json', pagination: true, pageSiz ...

  9. fzu 2105 Digits Count ( 线段树 ) from 第三届福建省大学生程序设计竞赛

    http://acm.fzu.edu.cn/problem.php?pid=2105 Problem Description Given N integers A={A[0],A[1],...,A[N ...

  10. 自己开发开源jquery插件--给jquery.treeview加上checkbox

    很多时候需要把树状的数据显示除来,比如分类,中国省份.城市信息,等,因此这方面的javascript插件也有很多.比如性能优异的jquery.treeview和国人开发的功能强大的zTree. 我最近 ...