WPF的使用都离不开这个接口。这个接口实现当ViewModel的数据发生变化的时候,通知前台页面的功能;

通常我们的ViewModel的写法都是这样的。Look:下面的代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;namespace WpfApplication4
{public class DemoViewModel:INotifyPropertyChanged{#region << Property >>public event PropertyChangedEventHandler PropertyChanged;private string name = string.Empty;public string Name{get { return name; }set{if (name != value){name = value;Notify("Name");}}}#endregion#region << Method >>public void Notify(string propertyName){if (PropertyChanged != null)PropertyChanged(this, new PropertyChangedEventArgs(propertyName));}#endregion}
}

上面的代码是凭感觉写的,没有实际调试过,不过一般都这种写法。

第二种 写法来之prism:

巧用了Lambda Expression。(确实不错)

1.封装了抽象类NotifyObject类

主要是封装了Notify方法(使用Lambda Expression)

protected void RaisePropertyChanged<T>(Expression<Func<T>> propertyExpression){var propertyName = PropertySupport.ExtractPropertyName(propertyExpression);this.RaisePropertyChanged(propertyName);}

 public static string ExtractPropertyName<T>(Expression<Func<T>> propertyExpression){if (propertyExpression == null){throw new ArgumentNullException("propertyExpression");}var memberExpression = propertyExpression.Body as MemberExpression;if (memberExpression == null){throw new ArgumentException(Resources.PropertySupport_NotMemberAccessExpression_Exception, "propertyExpression");}var property = memberExpression.Member as PropertyInfo;if (property == null){throw new ArgumentException(Resources.PropertySupport_ExpressionNotProperty_Exception, "propertyExpression");}var getMethod = property.GetGetMethod(true);if (getMethod.IsStatic){throw new ArgumentException(Resources.PropertySupport_StaticExpression_Exception, "propertyExpression");}return memberExpression.Member.Name;}

ExtracPropertyName唯一的目的就是解析Lambda Expression。获取属性名称。

prism中的使用就是这样

(手工写,不编译了)

private string name = string.Empty;

public string Name

{

  get { return name;}

  set

  {

    name = value;

    RaisePropertyChanged(()=>Name);

  }

}

要使用这个方法,就必须继承抽象类NotifyObject

方法3:来之之前开发,和查看CodeProject时候,自己的想法写的:Look

先看使用的代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;namespace WpfApplication4
{public class MainWindowsViewModel:NotifyObject{#region << Property >>public string Name{get { return GET(() => Name); }set { SET(() => Name, value); }}public string ButtonName{get { return GET(() => ButtonName); }set { SET(() => ButtonName, value); }}public ICommand DemoClick { get; set; }#endregion#region << Constructor >>public MainWindowsViewModel(){DemoClick = new DeletegateCommand(DemoMethod);}#endregion#region << Method >>public void DemoMethod(){// MessageBox.Show("Demo CheckBox Click");Name = "Notify";ButtonName = "NotifyButton";}public bool CanDemoMethod(){return false;}#endregion}
}

接着看实现(简单的实现)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;
using System.Linq.Expressions;namespace WpfApplication4
{public abstract class NotifyObject:INotifyPropertyChanged{#region << Field >>private object notifyObj = null;#endregion#region << Property >>public event PropertyChangedEventHandler PropertyChanged;#endregion#region << Method >>public T GET<T>(Expression<Func<T>> express){if (notifyObj == null)return default(T);elsereturn (T)notifyObj;}public void SET<T>(Expression<Func<T>> express, object obj){var memExpress = (MemberExpression)express.Body;if (memExpress == null)throw new Exception("The expression is valid");if (!Object.ReferenceEquals(notifyObj, obj)){var propertyName = memExpress.Member.Name;if (!string.IsNullOrEmpty(propertyName)){notifyObj = obj;Notify(propertyName);}}}private void Notify(string propertyName){if (PropertyChanged != null)PropertyChanged(this, new PropertyChangedEventArgs(propertyName));}#endregion}
}

这个方法最大的问题 每个属性都有自己的副本,实际上是两份的。这个会导致消耗内存。

第二个问题 是object box & unbox的性能损耗;

第三个问题 就是解析Lambda Expression的性能损耗;

对于一般的使用,估计影响不会太大。

也许这种写法,有很多的弊端。但毕竟有好的想法是不错的。这样写会使代码美观点。

我还是建议做WPF的多看看prism的代码实现。外国人写的确实有灵性。

转载于:https://www.cnblogs.com/qiurideyun/archive/2013/02/14/2912570.html

菲佣WPF——3(关于INotifyPropertyChanged的使用的想法)相关推荐

  1. NET 应用架构指导 V2 学习笔记(十九) 表现层组件设计指导

    5 决定数据绑定的需求 数据绑定在应用中,提供了一种在用户界面的控件和数据或者逻辑组件建立连接的方式.数据绑定允许你将数据库的数据,或者是其他结构的数据进行显示或者和他们进行交互.数据绑定是绑定目标( ...

  2. ViewModelBase ObservableObject

    ViewModelBase && ObservableObject 在Mvvm中,ViewModel和Model都需要具有通知界面更新数据的能力,这都要借助于WPF中的 INotify ...

  3. 【转载】wpf数据绑定binding与INotifyPropertyChanged

    WPF数据绑定号称是:数据变化会通过界面更新数据,这对新手而言,绝对是个误区,在我听说这句话的时候,我真是高兴,用了以后才发现其实没有那么美.要实现前面号称的特性,需要三个条件:1.进行绑定,2.绑定 ...

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

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

  5. WPF INotifyPropertyChanged 通过特性减少代码量

    在很多地方需要用上INotifyPropertyChanged的接口,MVVM模式,List等集合都会用到. 通常我们使用 protected void OnChange(PropertyChange ...

  6. WPF中INotifyPropertyChanged用法

    1.先建立类,在类中输入propfull,双击Tab按键 2.在头部引入 using System.ComponentModel; 3.建立BindingBase类,输入:后,选择继承INotifyP ...

  7. [WPF] UserControl vs CustomControl

    原文:[WPF] UserControl vs CustomControl 介绍 WPF中有两种控件:UserControl和CustomControl,但是这两者有什么区别呢?这篇博客中将介绍两者之 ...

  8. WPF入门:数据绑定

    原文:WPF入门:数据绑定 上一篇我们将XAML大概做了个了解 ,这篇将继续学习WPF数据绑定的相关内容 数据源与控件的Binding Binding作为数据传送UI的通道,通过INotityProp ...

  9. 【转载】wpf学习笔记1

    http://blog.csdn.net/fantasiax/article/details/4575968 深入浅出WPF(7)--数据的绿色通道,Binding(上) 小序: 怎么直接从2蹦到7啦 ...

  10. 分享Silverlight/WPF/Windows Phone一周学习导读(3月14日-3月19日)

    用了近一周的Windows Phone 7,作为长期使用iPhone的用户,刚使用WP7的确让人感觉挺生硬的,其中不乏先入为主的理由. 尽管如此,我还是非常喜欢Windows Phone 7个性界面, ...

最新文章

  1. Bzoj 1391: [Ceoi2008]order 网络流,最大权闭合图
  2. springboot 自定义类配置
  3. ubuntu 配置静态IP及DNS
  4. 项目管理的测试版发布
  5. python中iteritems,Python2中的dict.items()和dict.iteritems()有什么区别?
  6. 美国商务部发布软件物料清单 (SBOM) 的最小元素(上)
  7. quartz spring配置实例代码demo下载
  8. Hitool工具烧写程序(按分区烧写)
  9. 苹果刷机有好处和坏处_观察 | iTools推越狱助手 欲扩张苹果市场版图
  10. USACO-Section3.2 Feed Ratios【克莱默法则】
  11. QQ邮箱搜索器 邮箱地址批量搜索
  12. BFF —— Backend For Frontend
  13. 笔记本计算机风扇声音大怎么办,怎么解决笔记本风扇声音大 笔记本风扇声音大解决办法【图文】...
  14. 格式化格林威治时间(Wed Aug 01 00:00:00 CST 2018)
  15. 「IT行业必会的基本概念原理」计算机网路基本概念
  16. 使用jQuery,写一个简单的轮播图,实现切换功能!
  17. luogu 4084
  18. 怎么关闭excel出现的microsoft office 自定义安装程序提示
  19. 服务端没有 listen,客户端发起连接建立,会发生什么?
  20. 笔记本自带键盘失效问题

热门文章

  1. linux下mysql允许远程连接
  2. [转]献给2010年仍然单身的80后
  3. [转]paint,update和repaint三种awt方法
  4. mysql中将多行数据合并成一行数据
  5. JavaScript基础(三)
  6. 等待线程结束(join)
  7. 点击某些按钮不要触发验证控件
  8. 18.事件基础,event对象,clientX,clientY,keyCode
  9. IIS6.0系统日志中出现此错误Timer_MinBytesPerSecond,Timer_ConnectionIdle
  10. Date类的getYear(),getMonth过时,现在的获取方法