2016-04-06 78 views
3
的參數

我進入MVVM和偶然調用這個MWE所示OnPropertyChanged函數的兩個版本:OnPropertyChanged INotifyPropertyChanged的

public class SampleModel : INotifyPropertyChanged 
{ 
    private string _name; 

    public string Name 
    { 
     get { return _name; } 
     set 
     { 
      if (value == _name) return; 
      _name = value; 
      // Version 1 
      OnPropertyChanged(); 
      // Version 2 
      OnPropertyChanged(nameof(Name)); 
     } 
    } 

    #region INotifyPropertyChanged members 
    public event PropertyChangedEventHandler PropertyChanged; 

    [NotifyPropertyChangedInvocator] 
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
    #endregion 
} 

爲什麼我會選擇第1版超過2版本,反之亦然?

回答

5

由於[CallerMemberName]屬性,OnPropertyChanged();調用將自動獲取調用它的班級成員的名稱。

OnPropertyChanged(nameof(Name));顯式將屬性名稱作爲輸入參數發送給方法。

所以在你的情況下,這兩個調用將導致完全相同的PropertyChanged調用。

但是,如果您在方法或類似方法中更改_name並希望通知訂閱者,則顯式調用會很有用。

+0

我接受你的回答,因爲我不知道你在[CallerMemberName]中做了哪些解釋:) –

+0

在這裏需要:) 請記住[CallerMemberName]屬性僅適用於此,因爲字符串輸入是可選的('string propertyName = null') –

5

如果該屬性的值在未調用setter的情況下發生更改(作爲其他操作的副作用)並且您想要通知該屬性,則該屬性非常有用。在這種情況下,隱式CallerMemberName將不會提供正確的屬性名稱。

這主要是出現,如果你有一個只得到屬性,做一些內部狀態的轉換,以提供反饋。每次內部狀態發生變化時,都會通知只能獲取屬性(可能)已更改。就我個人而言,我試圖避免這種模式,因爲稍後您更改代碼時很容易忘記通知。