其实一直不知道INotifyPropertyChanged这个接口中PropertyChanged事件是什么时候有值的,因为在使用的时候,只要按步骤来就可以,因为我自己并没有对这个事件赋值,所以很好奇,网上看到一篇文章,说是观察者模式,但是也是自己给赋的值,真不知微软是
怎么实现的。下面是原文,来自:http://frankdzu.blog.sohu.com/117654536.html 普通观察者模式存在的问题 我们都知道观察者模式的优点,可以在属性发生改变时,来监听一个实现好了的事件,这样可以帮助来异步处理许多的事情,可是在观察者模式中,一般都是针对于实体来进行封装操作,可大多数的监听过程就需要写在实体的内部了,这样大大影响了实体封装的原子性,如果想实现什么监听事件,都需要在实体层进行更改,这另人太不悦了``` 不过,可以通过代理的方式,让实体里面监听的时候执行这个代理就好了,代理的功能由外部仍进来,不过这样也是破坏了实体本身,需要由外部来传递参数,这样对于底层开发人员来说,也不是很愉快的事情。 实现 INotifyPropertyChanged 怎么样才能既实现了监听,也不破坏实体的特性,让监听的事件外露呢?所以通过实现 INotifyPropertyChanged来解决这一问题。 原型:event PropertyChangedEventHandler PropertyChanged 下面这个例子将详细说明用法: using System; using System.Collections.Generic; using System.Text; using System.ComponentModel; namespace Demo { class Program { public static void Main(string[] args) { // 创建实例 DemoCustomer demoCustomer = DemoCustomer.CreateNewCustomer(); // 实现事件触发需要处理的事情 demoCustomer.PropertyChanged += new PropertyChangedEventHandler(demoCustomer_PropertyChanged); // 更新值 引发事件 demoCustomer.PhoneNumber = ""; // 等待 Console.ReadLine(); } static void demoCustomer_PropertyChanged(object sender, PropertyChangedEventArgs e) { // 获取被更改的属性名 Console.WriteLine(e.PropertyName); // 获取最新更新的值 Console.WriteLine(((DemoCustomer)sender).PhoneNumber); } } // 实现 INotifyPropertyChanged 接口 进行监听 public class DemoCustomer : INotifyPropertyChanged { // 默认的私有属性 private Guid idValue = Guid.NewGuid(); private string customerName = String.Empty; private string companyNameValue = String.Empty; private string phoneNumberValue = String.Empty; /// <summary> /// 在更改属性时引发的事件。(这个事件将被外露。) /// </summary> public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged(String info) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(info)); } } // 默认的构造 private DemoCustomer() { customerName = "no data"; companyNameValue = "no data"; phoneNumberValue = "no data"; } // 简单的工厂模式 public static DemoCustomer CreateNewCustomer() { return new DemoCustomer(); } public Guid ID { get { return this.idValue; } } public string CompanyName { get { return this.companyNameValue; } set { if (value != this.companyNameValue) { this.companyNameValue = value; // 当发生改变时,那么就触发事件,传入触发的属性名 NotifyPropertyChanged("CompanyName"); } } } public string PhoneNumber { get { return this.phoneNumberValue; } set { if (value != this.phoneNumberValue) { this.phoneNumberValue = value; // 当发生改变时,那么就触发事件,传入触发的属性名 NotifyPropertyChanged("PhoneNumber"); } } } } }

观察者模式实现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. javascript-对象的创建(一)

    <!DOCTYPE html> <%@ page language="java" contentType="text/html; charset=UTF ...

  2. SQL语句基本概念

    星期五 2014年11月21日 SQL语句:     sql语句用于检索维护数据库中的数据                   [ create alter Select update        ...

  3. Java多线程(二) 多线程的锁机制

    当两条线程同时访问一个类的时候,可能会带来一些问题.并发线程重入可能会带来内存泄漏.程序不可控等等.不管是线程间的通讯还是线程共享数据都需要使用Java的锁机制控制并发代码产生的问题.本篇总结主要著名 ...

  4. 你可以用OpenCV来干什么

    本文翻译自开源图书“OpenCV by Example”中第1章中的“What can you do with OpenCV?”小节. 使用OpenCV,你几乎可以做任何你能够想到的计算机视觉任务.现 ...

  5. linux与windows共享剪贴板(clipboard)

    linux与windows共享剪贴板(clipboard)的方法 先说两句废话,其实linux和windows之间不需要共享剪贴板,直接在putty中,按住SHIFT+鼠标选择就可以了. 但是作为一种 ...

  6. jQuery插件开发 - 其实很简单

    [前言] jQuery已经被广泛使用,凭借其简洁的API,对DOM强大的操控性,易扩展性越来越受到web开发人员的喜爱,我在社区也发布了很多的jQuery插件,经常有人询问一些技巧,因此干脆写这么一篇 ...

  7. MYSQL数据库主主同步实战

    MYSQL支持单向.异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器.主服务器将更新写入二进制日志文件,并维护日志文件的一个索引以跟踪日志循环.当一个从服务器连接到主服务 ...

  8. java 中的this关键字的几种用法

    转自:http://blog.csdn.net/anmei2010/article/details/4091227 1.     当成员变量和局部变量重名时,在方法中使用this时,表示的是该方法所在 ...

  9. Linux进程间通信IPC学习笔记之同步二(Posix 信号量)

    Linux进程间通信IPC学习笔记之同步二(Posix 信号量)

  10. 再次学习C++类之构造函数

    学习C++类,首先要说C中的结构体,虽然C++类扩展了C中的结构体,可以添加成员函数,但他们是有区别的.在结构体中,成员变量.成员函数都是公有的,而类中,一般是成员变量是私有的,成员函数是公有的,私有 ...