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的时候, 都需要传一个自己的属性名, 这样是不是很多余?对, 很多余。
改造
看到有些文章给基类的参数修改为表达式树, 这样实现的时候,传递一个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使用方法的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持。