INotifyPropertyChanged:

该接口包含一个事件, 针对属性发生变更时, 执行该事件发生。

    //
// 摘要:
// 通知客户端属性值已更改。
public interface INotifyPropertyChanged
{
//
// 摘要:
// 在属性值更改时发生。
event PropertyChangedEventHandler PropertyChanged;
}

接下来, 用一个简单的示例说明其简单使用方法(大部分常用的做法演示):

1.定义一个ViewModelBase 继承INotifyPropertyChanged 接口, 添加一个虚函数用于继承子类的属性进行更改通知

2.MainViewModel中两个属性, Code,Name 进行了Set更改时候的调用通知,

     public class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
} public class MainViewModel : ViewModelBase
{
private string name;
private string code; public string Name
{
get { return name; }
set { name = value; OnPropertyChanged("Name"); }
} public string Code
{
get { return code; }
set { code = value; OnPropertyChanged("Code"); }
}
}

正如上面的代码, 应该注意到了, 每个属性调用OnPropertyChanged的时候, 都需要传一个自己的属性名, 这样是不是很多余?对, 很多余。

改造

1.看到有些文章给基类的参数修改为表达式树, 这样实现的时候,传递一个Lambda表达式, 我觉得这是不治标不治本吗?如下:

说明: 原来直接传递一个固定的string类型实参,  不说换成lambda的性能问题, 同样带来的问题你还是固定的需要去书写这个参数。 不建议这么做!

CallerMemberName

该类继承与 Attribute, 不难看出, 该类属于定义在方法和属性上的一种特效类, 实现该特性允许获取方法调用方的方法或属性名称

    //
// 摘要:
// 允许获取方法调用方的方法或属性名称。
[AttributeUsage(AttributeTargets.Parameter, Inherited = false)]
public sealed class CallerMemberNameAttribute : Attribute
{
//
// 摘要:
// 初始化 System.Runtime.CompilerServices.CallerMemberNameAttribute 类的新实例。
public CallerMemberNameAttribute();
}

 改造ViewModelBase:

改造之后, 是不是发现明显区别:

不用传递参数, 不用书写lambda表达式, 也不用担心其传递的参数安全, 直接根据读取属性名!

C# INotifyPropertyChanged 实现的更多相关文章

  1. 传智播客--数据绑定--INotifyPropertyChanged(小白内容)

    INotifyPropertyChanged一般在数据绑定的时候使用. InotifyPropertyChanged是.net内置的接口,数据绑定时会检测DataContext是否实现了Inotify ...

  2. INotifyPropertyChanged, Interface

    Data Object(class) impliment INotifyPropertyChanged; then the Object can update BindingSource. Impli ...

  3. Data Binding和INotifyPropertyChanged是如何协调工作的?

    前言 WPF的一大基础就是Data Binding.在基于MVVM架构的基础上,只有通过实现INotifyPropertyChanged接口的ViewModel才能够用于Data Binding. 要 ...

  4. 如何优雅的实现INotifyPropertyChanged接口

    INotifyPropertyChanged接口在WPF或WinFrom程序中使用还是经常用到,常用于通知界面属性变更.标准写法如下: class NotifyObject : INotifyProp ...

  5. INotifyPropertyChanged接口的PropertyChanged 事件

    INotifyPropertyChanged 接口用于向客户端(通常是执行绑定的客户端)发出某一属性值已更改的通知. 例如,考虑一个带有名为 FirstName 属性的 Person 对象. 若要提供 ...

  6. 为Page添加INotifyPropertyChanged功能

    在Page页面里面, DataContext 更新后,前台数据要求会自动更新. 但前台的绑定如果用x:bind 语法. 它要求强类型.直接关联到DataContext上就不行了. 需要为Page 添加 ...

  7. 【.NET深呼吸】INotifyPropertyChanged接口的真故事

    无论是在流氓腾的问问社区,还是在黑度贴吧,或是“厕所等你”论坛上,曾经看到过不少朋友讨论INotifyPropertyChanged接口.不少朋友认为该接口是为双向绑定而使用的,那么,真实的情况是这样 ...

  8. 使用CallerMemberName简化InotifyPropertyChanged的实现

    在WPF中,当我们要使用MVVM的方式绑定一个普通对象的属性时,界面上往往需要获取到属性变更的通知,     class NotifyObject : INotifyPropertyChanged   ...

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

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

  10. DependencyProperties or INotifyPropertyChanged ?

    When you want to make an object binding-aware you have two choices : implements INotifyPropertyChang ...

随机推荐

  1. 【金阳光測试】基于控件核心技术探讨---Android自己主动化系列(2)---2013年5月

    第一讲分享了下安卓自己主动化一些概况和一些自己主动化框架现状和技术可以解决什么样的问题. 这次课就深入到android世界里面.遨游.翱翔.深入了解自己主动化測试核心技术. 搞过编程开发的同学听到in ...

  2. programming-challenges Shoemaker's Problem (110405) 题解

    Greedy. 证明: Let's say we have job 1, 2, ..., n, and they have time and fine as t1, f1, t2, f2, ..., ...

  3. JNI中java类型的简写

      在JNI中,当我们使用GetFieldID/GetStaticFieldID或GetMethodID/GetStaticMethodID及定义JNINativeMethod等时,我们需要表示成员变 ...

  4. Kali linux2.0里Metasploit的服务类型探测

    不多说,直接上干货! 在MSF终端中,可以输入search name:_version命令查看所有可用的服务查点模块 该命令的执行结果如下: root@kali:~# msfconsole ..... ...

  5. Auto-Publishing and Monitoring APIs With Spring Boot--转

    原文地址:https://dzone.com/articles/auto-publishing-amp-monitoring-apis-with-spring-bo If you are headin ...

  6. 200 from memory cache / from disk cache / 304 Not Modified 区别

    三者情况有什么区别和联系,什么情况下会发生200 from memory cache 或 200 from disk cache 或 304 Not Modified? 200 from memory ...

  7. webpack 读取文件变量

    1.webpack 获取文件中变量 <%= htmlWebpackPlugin.options.title %> <p><%= htmlWebpackPlugin.opt ...

  8. T-SQL函数类型——系统函数

    1 ??? 为什么 123 和'123'的ISNUMERIC()返回结果相同. SELECT ISNUMERIC(123)  --结果为1SELECT ISNUMERIC('123') --结果为1S ...

  9. ELK安装笔记

    1.jdk安装 2.logstash安装使用 #命令方式[root@ELK ELK]# tar xf logstash-5.3.2.tar.gz [root@ELK logstash-5.3.2]# ...

  10. LightOJ-1282 Leading and Trailing 模算数 快速幂 对数的用法

    题目链接:https://cn.vjudge.net/problem/LightOJ-1282 题意 给出两个正整数n(2 ≤ n < 231), k(1 ≤ k ≤ 1e7) 计算n^k的前三 ...