INotifyPropertyChanged 在WPF MVVM模式開發中,實現INotifyPropertyChanged的ViewModel是非常重要且常見的類: 在類里,需要響應變化的屬性都需要在Setter里調用屬性變化的方法: 這樣的寫法,一個兩個屬性還好,在有很多屬性的情況下,就顯得有一 ...
INotifyPropertyChanged
在WPF MVVM模式開發中,實現INotifyPropertyChanged的ViewModel是非常重要且常見的類:
public class MainViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
在類里,需要響應變化的屬性都需要在Setter里調用屬性變化的方法:
private string _appName;
public string AppName
{
get
{
return _appName;
}
set
{
if (_appName == value)
return;
_appName = value;
OnPropertyChanged(nameof(AppName));
}
}
這樣的寫法,一個兩個屬性還好,在有很多屬性的情況下,就顯得有一些繁雜,今天要介紹一款開源的工具就是為瞭解決這個問題。
Fody/PropertyChanged
開源地址: https://github.com/Fody/PropertyChanged/
在編譯時,在屬性中實現 INotifyPropertyChanged 的代碼
使用方法
-
通過Nuget安裝
PM> Install-Package PropertyChanged.Fody
-
安裝完成後,會在項目中,添加FodyWeavers.xml文件,這是Fody的配置文件,詳細可以參考 Fody
<?xml version="1.0" encoding="utf-8"?>
<Weavers>
<PropertyChanged />
</Weavers>
說明
項目中所有標記有[ImplementPropertyChanged]特性,或者實現了INotifyPropertyChanged的類,都將自動在其屬性中實現通知相關的代碼,除非屬性被顯示標記為不通知
- 程式中的代碼:
[ImplementPropertyChanged]
public class Person
{
public string GivenNames { get; set; }
public string FamilyName { get; set; }
public string FullName
{
get
{
return string.Format("{0} {1}", GivenNames, FamilyName);
}
}
}
或者
public class MainViewModel : INotifyPropertyChanged
{
public string GivenNames { get; set; }
public string FamilyName { get; set; }
public string FullName
{
get
{
return string.Format("{0} {1}", GivenNames, FamilyName);
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
- 編譯後對應的
public class Person : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
string givenNames;
public string GivenNames
{
get { return givenNames; }
set
{
if (value != givenNames)
{
givenNames = value;
OnPropertyChanged("GivenNames");
OnPropertyChanged("FullName");
}
}
}
string familyName;
public string FamilyName
{
get { return familyName; }
set
{
if (value != familyName)
{
familyName = value;
OnPropertyChanged("FamilyName");
OnPropertyChanged("FullName");
}
}
}
public string FullName
{
get
{
return string.Format("{0} {1}", GivenNames, FamilyName);
}
}
public virtual void OnPropertyChanged(string propertyName)
{
var propertyChanged = PropertyChanged;
if (propertyChanged != null)
{
propertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}