相信全部学wpf的,都写过相似下面的代码:
实现INotifyPropertyChangedgit
public class MainViewModel : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string propertyName) { if (this.PropertyChanged != null) this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } }
调用github
private string _userName = string.Empty; /// <summary> /// 用户名 /// </summary> public string UserName { get => _userName; set { _userName = value; OnPropertyChanged(); } }
当属性多起来时,这就很烦人了····
因而乎,咱们的PropertyChanged.Fody
就登场了微信
这是一个附加组件库。咱们能够经过nuget安装,也能够经过在程序包管理控制台输入如下内容:网站
PM> Install-Package Fody PM> Install-Package PropertyChanged.Fody
安装完成后,咱们须要手动添加名为FodyWeavers.xml的文件,右键项目添加项选择xml文件便可。
注:该文件是Fody配置文件,更多信息请参考配置
若是仅仅实现通知,咱们只须要在文件内添加一下内容this
<Weavers> <PropertyChanged/> </Weavers>
完成以上操做后,全部实现 INotifyPropertyChanged
的类都将通知代码注入到属性设置器中。
例如:code
public class Person : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; public string GivenNames { get; set; } public string FamilyName { get; set; } public string FullName => $"{GivenNames} {FamilyName}"; }
在编译后就会成为:xml
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给咱们提供了标记特性。图片
咱们只须要在属性上打上要通知的属性便可。get
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; } }
咱们也能够标记某属性更新时不须要通知。博客
public class Person : INotifyPropertyChanged { public string GivenName { get; set; } [DoNotNotify] public string FamilyName { get; set; } public event PropertyChangedEventHandler PropertyChanged; }
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~