WPF開發進階 - Fody/PropertyChanged(一)


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 的代碼

使用方法

  1. 通過Nuget安裝

    PM> Install-Package PropertyChanged.Fody

  2. 安裝完成后,會在項目中,添加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));
       }
   }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM