当前位置: 首页 > news >正文

【转载】INotifyPropertyChanged

1、介绍

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

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

 

作用:监听属性值的变化。

有时候,我们需要监听属性值的变化,当属性值发生改变时,需要被通知,没有改变时不需要通知,这个时候可以用INotifyPropertyChanged来做,也可以自定义委托事件,目的是当属性值发生变化时,才触发事件。

2、使用

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

 //ViewModelBase类public class ViewModelBase : INotifyPropertyChanged{public event PropertyChangedEventHandler PropertyChanged;protected virtual void OnPropertyChanged(string propertyName){if (this.PropertyChanged != null)//有改变this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));}}

(2)定义一个MainViewModel类 继承ViewModelBase类,MainViewModel中两个属性, Code,Name 进行了Set更改时候的调用通知。

    public class MainViewModel:ViewModelBase{private string _name;private string _code;public string Name{get{return _name;}set{_name = value;base.OnPropertyChanged("Name");}} public string Code{get{return _code;}set{_code = value;base.OnPropertyChanged("Code");}}}

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

3、改进

CallerMemberName类

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

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

(1)改造ViewModelBase类

 //ViewModelBase类public class ViewModelBase : INotifyPropertyChanged{public event PropertyChangedEventHandler PropertyChanged;protected virtual void OnPropertyChanged([CallerMemberName]string propertyName = null){if (this.PropertyChanged != null)//有改变this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));}}

(2)MainViewModel类引用

    public class MainViewModel:ViewModelBase{private string _name;private string _code;public string Name{get{return _name;}set{_name = value;base.OnPropertyChanged();}} public string Code{get{return _code;}set{_code = value;base.OnPropertyChanged();}}}

4、最佳实现

参考:https://www.cnblogs.com/bcmeng/p/3966931.html

 

 

    public class ModelBase : INotifyPropertyChanged{public event PropertyChangedEventHandler PropertyChanged;protected bool SetProperty<T>(ref T storage, T value, [CallerMemberName] String propertyName = null){if (object.Equals(storage, value)) return false;storage = value;this.OnPropertyChanged(propertyName);return true;}protected void OnPropertyChanged([CallerMemberName] string propertyName = null){var eventHandler = this.PropertyChanged;if (eventHandler != null)eventHandler(this, new PropertyChangedEventArgs(propertyName));}}

相应的调用方式进一步简化:

    public class Model:ModelBase  { private string name;public string Name{get { return name; }set{ this.SetProperty(ref this.name, value); }}}

 


————————————————
版权声明:本文为CSDN博主「zwb_578209160」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zwb_578209160/article/details/104220398

http://www.jsqmd.com/news/97806/

相关文章:

  • 终极指南:RAX3000M路由器OpenWrt固件快速选择策略
  • 辣味零食推荐|我最近的“重口味解馋搭子”:辣人辣椒酥(Mr. HOT) - AIEO
  • 2025年12月环氧地坪研磨机,小型地坪研磨机,遥控式地坪研磨机厂家推荐:智能高效机型权威盘点 - 品牌鉴赏师
  • 宝塔 Linux 面板 Docker 容器化部署指南
  • 农业产量预测模型实战(R语言评估全解析)
  • 2025年液压数控折弯机厂家权威推荐榜单:对称三辊卷板机 ‌/液压板料折弯机‌/板料折弯机源头厂家精选 - 品牌推荐官
  • 15 分钟打通跨 VPC 通信!公有云边界路由器快速上手课(9)
  • 13、Samba 文件命名与锁定机制详解
  • UltraVNC远程控制实战指南:从零掌握高效连接技巧
  • Lottie-Android多色渐变动画实战指南
  • JELOS:重新定义掌上娱乐体验的终极Linux系统
  • 5分钟打造专业级纸质测量工具:免费应急尺子终极指南
  • Noria数据流系统:重新定义高性能Web应用架构
  • Pintr图像艺术化工具:一键将照片转化为专业线条画的终极指南
  • Kotaemon深度解析:构建可复现检索增强生成系统的最佳实践
  • MNN多模型部署终极指南:从并行执行到智能流量控制
  • 杰理之CIG或BIG连上后安卓手机音量同步功能异常【篇】
  • 如何快速上手Ocrad.js:JavaScript OCR识别的完整指南
  • React CSS Modules 4.3.0 升级实战:5步实现样式管理现代化
  • 算力基建热潮,HDI如何批量“不掉线”
  • 杰理之做tws功能时出现解码失败无声问题【篇】
  • 2025年行业内比较好的隔音门窗厂商怎么选择,隔音门窗/被动式窗/豪宅设计/环保门窗/复古门窗/智能门窗生产厂家口碑推荐 - 品牌推荐师
  • 10款高颜值Zsh主题:让你的终端效率翻倍的终极指南
  • 一人公司的3种路径,给职业焦虑者的启示#Mixlab launchpad社群#线下活动总结
  • 杰理之连接杰理之家时不进行设备认证【篇】
  • 攻防演练视角下的挖矿木马应急响应全流程实验:从告警溯源到纵深防御
  • 技术面试终极指南:从算法学习到面试成功的完整路径
  • 企业知识库检索难题?Langchain-Chatchat混合检索技术如何实现Top3精准匹配
  • 7个Arkime监控实用技巧:让流量分析平台运行更稳定高效
  • 终极指南:FlutterToast跨平台通知组件完全掌握