2021年1月30日星期六

Fody,告别烦人的INotifyPropertyChanged,最简方式实现通知!

Fody,告别烦人的INotifyPropertyChanged,最简方式实现通知!

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 FodyPM> Install-Package PropertyChanged.Fody

在编译后就会成为:

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~









原文转载:http://www.shaoqun.com/a/521182.html

跨境电商:https://www.ikjzd.com/

二类电商:https://www.ikjzd.com/w/1457

skyee:https://www.ikjzd.com/w/290


Fody,告别烦人的INotifyPropertyChanged,最简方式实现通知!INotifyPropertyChanged我不是针对谁,我是说在座的各位相信所有学wpf的,都写过类似下面的代码:实现INotifyPropertyChangedpublicclassMainViewModel:INotifyPropertyChanged{publiceventPropertyChangedEv
淘粉吧首页:淘粉吧首页
网易考拉海购大促:网易考拉海购大促
注意!印度再次提高进口关税,鞋类关税升至35%玩具升至60%:注意!印度再次提高进口关税,鞋类关税升至35%玩具升至60%
每日资讯:欧洲多国停飞往返英国航班!亚马逊因疫情临时关闭新泽西州一货仓!:每日资讯:欧洲多国停飞往返英国航班!亚马逊因疫情临时关闭新泽西州一货仓!
南美8国不让网商亚马逊公司专用"亚马孙"域名!:南美8国不让网商亚马逊公司专用"亚马孙"域名!

没有评论:

发表评论