INotifyPropertyChanged

我不是针对谁,我是说在座的各位

相信所有学wpf的,都写过类似下面的代码:

实现INotifyPropertyChanged

public class MainViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}

调用


private string _userName = string.Empty;
/// <summary>
/// 用户名
/// </summary>
public string UserName
{
get => _userName;
set
{
_userName = value;
OnPropertyChanged();
}
}

当属性多起来时,这就很烦人了····

于是乎,我们的PropertyChanged.Fody就登场了

通过nuget安装PropertyChanged.Fody

这是一个附加组件库。我们可以通过nuget安装,也可以通过在程序包管理控制台输入以下内容:

PM> Install-Package Fody
PM> Install-Package PropertyChanged.Fody

手动添加FodyWeavers.xml文件

安装完成后,我们需要手动添加名为FodyWeavers.xml的文件,右键项目添加项选择xml文件即可。

注:该文件是Fody配置文件,更多信息请参考配置

如果仅仅实现通知,我们只需要在文件内添加一下内容

<Weavers>
<PropertyChanged/>
</Weavers>

完成以上操作后,所有实现 INotifyPropertyChanged 的类都将通知代码注入到属性设置器中。

例如:

public class Person : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged; public string GivenNames { get; set; }
public string FamilyName { get; set; }
public string FullName => $"{GivenNames} {FamilyName}";
}

在编译后就会成为:

public class Person : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged; string givenNames;
public string GivenNames
{
get => givenNames;
set
{
if (value != givenNames)
{
givenNames = value;
OnPropertyChanged(InternalEventArgsCache.GivenNames);
OnPropertyChanged(InternalEventArgsCache.FullName);
}
}
} string familyName;
public string FamilyName
{
get => familyName;
set
{
if (value != familyName)
{
familyName = value;
OnPropertyChanged(InternalEventArgsCache.FamilyName);
OnPropertyChanged(InternalEventArgsCache.FullName);
}
}
} public string FullName => $"{GivenNames} {FamilyName}"; protected void OnPropertyChanged(PropertyChangedEventArgs eventArgs)
{
PropertyChanged?.Invoke(this, eventArgs);
}
} internal static class InternalEventArgsCache
{
internal static PropertyChangedEventArgs FamilyName = new PropertyChangedEventArgs("FamilyName");
internal static PropertyChangedEventArgs FullName = new PropertyChangedEventArgs("FullName");
internal static PropertyChangedEventArgs GivenNames = new PropertyChangedEventArgs("GivenNames");
}

特性

我们自然有些特殊需求,例如我需要更新A属性通知B属性,需要某些属性不通知等等需求。于是Fody给我们提供了标记特性。

AlsoNotifyForAttribute(允许注入指向不同属性的通知代码。)

我们只需要在属性上打上要通知的属性即可。

public class Person : INotifyPropertyChanged
{
[AlsoNotifyFor("FullName")]
public string GivenName { get; set; } [AlsoNotifyFor("FullName")]
public string FamilyName { get; set; } public event PropertyChangedEventHandler PropertyChanged; public string FullName { get; set; }
}

DoNotNotifyAttribute(不要通知我)

我们也可以标记某属性更新时不需要通知。

public class Person : INotifyPropertyChanged
{
public string GivenName { get; set; }
[DoNotNotify]
public string FamilyName { get; set; }
public event PropertyChangedEventHandler PropertyChanged;
}

DependsOnAttribute(注入此属性以便在设置依赖属性时得到通知。)

public class Person : INotifyPropertyChanged
{
public string GivenName { get; set; } public string FamilyName { get; set; } public event PropertyChangedEventHandler PropertyChanged; [DependsOn("GivenName","FamilyName")]
public string FullName { get; set; }
}

后记

本人不是大佬,只是道路先行者,在落河后,向后来的人大喊一声,这里有坑,不要过来啊!

纵然如此,依旧有人重复着落河,重复着呐喊······

个人博客网站 Blog

技术交流Q群: 1012481075 群内有各种流行书籍资料

文章后续会在公众号更新,微信搜索 OneByOneDotNet 即可关注。

你的一分鼓励,我的十分动力,点赞免费,感恩回馈。喜欢就点赞评论吧,双击66~

最新文章

  1. Thread.Sleep(0) vs Sleep(1) vs Yeild
  2. 转载:C#中的泛型
  3. karottc A Simple linux-virus Analysis、Linux Kernel &lt;= 2.6.37 - Local Privilege Escalation、CVE-2010-4258、CVE-2010-3849、CVE-2010-3850
  4. Mysql 如何做双机热备和负载均衡
  5. Spring的IoC容器注入的类型
  6. C/C++中的隐藏依赖
  7. hdu2955 Robberies  01背包+概率
  8. 深入剖析AutoreleasePool
  9. Hadoop YARN配置参数剖析—RM与NM相关参数
  10. ubuntu完全卸载一个软件
  11. memcached实例(enyim.com Memcached Client)
  12. BZOJ 1006: [HNOI2008]神奇的国度( MCS )
  13. 摘-BMC自动化解决方案产品概览
  14. 对vue源码的初步认识和理解
  15. MySql:SELECT 语句(二)排序 ORDER BY 的使用
  16. python接口自动化测试六:时间戳,防重复处理
  17. Web3.js 0.20.x API 中文版翻译
  18. Gradle 完整指南(Android)
  19. 动画js版本
  20. asp.net mvc webconfig配置文件操作

热门文章

  1. 物联网、5G世界与大数据管理
  2. HashMap的循环姿势你真的掌握了吗?
  3. 安装git之后,桌面出现蓝色问号的解决方法
  4. 什么情况下调用doGet()和doPost()?
  5. Spring3 MVC 注解(一)---注解基本配置及@controller和 @RequestMapping 常用解释(转)
  6. 安装cmake过程g++: 错误:unrecognized command line option ‘-std=gnu++14’
  7. Modbus java slave app
  8. windows10系统修改JDK版本后配置环境变量不生效怎么办
  9. 这些JS技巧,看看你是否都会用?
  10. MFC3 基本对话框的使用(三) 滑块与进度条(sdnu)(C++大作业)