2016-04-06 14 views
3
のパラメータ

をOnPropertyChangedをし、このMWEに示すOnPropertyChanged関数を呼び出す2つのバージョンにつまずい:はMVVMに私が取得しています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 
} 

なぜ私はバージョン2の上にバージョン1を選択し、その逆のでしょうか?

答えて

5

[CallerMemberName]属性のため、呼び出されたクラスメンバーの名前が自動的に取得されます。OnPropertyChanged();

OnPropertyChanged(nameof(Name));は、入力パラメータとしてプロパティ名をメソッドに明示的に送信します。

したがって、2つの呼び出しでは、同じPropertyChanged呼び出しが行われます。

しかし、明示的な呼び出しは、メソッドなどで_nameを変更し、サブスクライバに通知する必要がある場合に便利です。

+0

あなたが説明した '[CallerMemberName] 'が何であるかわからないので、私はあなたの答えを受け入れています:) –

+0

ここに必要だったのは:) [CallerMemberName]入力はオプションです( 'string propertyName = null') –

5

バージョン2(明示的なプロパティ名付き)は、プロパティの値が(他の操作の副作用として)セッターを呼び出さずに変更され、そのことを通知したい場合に便利です。その場合、暗黙のCallerMemberNameは正しいプロパティ名を提供しません。

これは主に、フィードバックを提供するために内部状態の変換を行うget-onlyプロパティがある場合に発生します。内部状態が変わるたびに、get-onlyプロパティ(may)が変更されたことを通知します。個人的には、このパターンを避けようとします。後でコードを変更するときに通知するのを忘れるのは簡単です。

関連する問題