Fody,告别烦人的INotifyPropertyChanged,最简方式实现通知!
2024-09-08 00:04:34
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~
最新文章
- Thread.Sleep(0) vs Sleep(1) vs Yeild
- 转载:C#中的泛型
- karottc A Simple linux-virus Analysis、Linux Kernel <;= 2.6.37 - Local Privilege Escalation、CVE-2010-4258、CVE-2010-3849、CVE-2010-3850
- Mysql 如何做双机热备和负载均衡
- Spring的IoC容器注入的类型
- C/C++中的隐藏依赖
- hdu2955 Robberies 01背包+概率
- 深入剖析AutoreleasePool
- Hadoop YARN配置参数剖析—RM与NM相关参数
- ubuntu完全卸载一个软件
- memcached实例(enyim.com Memcached Client)
- BZOJ 1006: [HNOI2008]神奇的国度( MCS )
- 摘-BMC自动化解决方案产品概览
- 对vue源码的初步认识和理解
- MySql:SELECT 语句(二)排序 ORDER BY 的使用
- python接口自动化测试六:时间戳,防重复处理
- Web3.js 0.20.x API 中文版翻译
- Gradle 完整指南(Android)
- 动画js版本
- asp.net mvc webconfig配置文件操作
热门文章
- 物联网、5G世界与大数据管理
- HashMap的循环姿势你真的掌握了吗?
- 安装git之后,桌面出现蓝色问号的解决方法
- 什么情况下调用doGet()和doPost()?
- Spring3 MVC 注解(一)---注解基本配置及@controller和 @RequestMapping 常用解释(转)
- 安装cmake过程g++: 错误:unrecognized command line option ‘-std=gnu++14’
- Modbus java slave app
- windows10系统修改JDK版本后配置环境变量不生效怎么办
- 这些JS技巧,看看你是否都会用?
- MFC3 基本对话框的使用(三) 滑块与进度条(sdnu)(C++大作业)