当前位置: 首页 > 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://icebutterfly214.com/news/112181/

相关文章:

  • 杰理之连接杰理之家时不进行设备认证【篇】
  • 终极AI开发指南:5步构建自主可控的智能系统
  • 3个技巧彻底解决CloudStream下载文件混乱问题
  • open_clip开源项目实战指南:从零到贡献者的成长阶梯
  • 颠覆传统:3D球体抽奖系统如何让年会活动焕发新生
  • MFC CEdit 屏蔽右健菜单
  • BilibiliSponsorBlock完整教程:一键跳过B站广告实现纯净观看
  • 新项目为什么更推荐WebFlux,而非SpringMVC?
  • 基于Java springboot教培机构在线教育平台系统教学资源课程学习作业布置提交批改(源码+文档+运行视频+讲解视频)
  • 真实环境中态、势、感、知的链式反应
  • 面试经典150题[072]:从前序与中序遍历序列构造二叉树(LeetCode 105)
  • Galaxy开源UI组件库完整使用指南:3000+免费组件快速上手
  • AI数字人创业新风口:基于Linly-Talker打造虚拟主播解决方案
  • 3分钟AI空间革命:RoomGPT如何重塑未来家居设计
  • oeasy玩py110列表_最大值_最小值_平均值_max_min_avg_sum
  • 上海市奉贤区自建房设计公司/机构权威测评推荐排行榜 - 苏木2025
  • 3分钟快速上手:这款思维导图神器让创意整理变得如此简单
  • 如何快速配置Mesop Select组件默认值:新手开发者的完整指南
  • 3小时精通POCO C++库:从零开始的跨平台网络编程实战
  • 深入掌握Flutter网络请求:Dio与Provider架构完美融合实践
  • Wechaty v1.20.2终极指南:5大RPA功能让聊天机器人开发效率飙升300%
  • 基于Transformer的嵌入模型如何增强Anything-LLM的搜索精度?
  • B站广告一键跳过神器:BilibiliSponsorBlock完全使用指南
  • Typst数学公式完美对齐指南:告别错位困扰
  • Obsidian Zotero Integration:构建学术笔记与文献管理的完美桥梁
  • Excalidraw免费HTML网站推荐:无需安装即可在线使用
  • 前端剪贴板革命:告别Flash,用clipboard.js实现优雅复制
  • SmartAdmin企业级安全系统快速部署实战指南
  • 15分钟搞定跨模态搜索:Qdrant向量数据库实战指南
  • 企业级权限表结构设计经典设计--纯个人分享(三)