2016-10-20 14 views
1

INotifyPropertyChangedを実装するとき、私はpropertyNameの意味を決して確かめませんでした。私はNotifyPropertyChanged(string propertyName)からpropertyName引数わからなかったINotifyPropertyChangedとpropertyName

public class Data : INotifyPropertyChanged { 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged(string propertyName = "") { 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 

    private string itsID; 
    public string ID { 
      get { return itsID; } 
      set { 
        if (itsID != value) { 
        itsID = value; 
        NotifyPropertyChanged("ID"); 
        } 
    } 
} 

:だから、一般的に、あなたはとしてINotifyPropertyChangedを実装します。

  1. 任意の文字列(上記の例では「MyID」など)を使用できますか?
  2. .NETはReflectionを使用してクラス内のプロパティと整列させるので、プロパティの名前と正確に一致する必要がありますか?
  3. propertyNamePropertyの名前と正確に一致しない場合、.NETはオブジェクト全体をchangedと見なしますか?
+0

'if(PropertyChanged!= null)'を実行しているときにこれを避けてください。 'null'チェック後に' PropertyChanged'チェックが実際に 'null'になる可能性があります。代わりに、ローカル変数を最初に設定し、次にチェックする方が安全です。例えば'var handler = PropertyChanged; if(handler!= null){handler()... // raise} ' - あるいはC#6から、新しい" null条件演算子 "を使うことができます:' PropertyChanged?.Invoke(...) 'は二倍になります'ヌル'チェック*と*を一度に起動します。 –

+2

ここではかなり説明しています(https://www.cs.colorado.edu/~kena/classes/5448/f12/presentation-materials/ellis.pdf)。これは.NETソースコードで、これらすべての実際のトラッキング(https://referencesource.microsoft.com/#System.Data.Services.Client/Client/System/Data/Services/Client/Binding/BindingObserver.cs,2ac792c61e2e7eb2,references)。 WPFは基本的にプロパティー変更イベントをサブスクライブし、イベント引数を使用します。イベント引数の1つはIDに使用する文字列(MyIDなど)であり、それを使用してコントロールの更新を行います。 – Alexandru

答えて

2

それは.NET Framework自体ではありません。あなたが意図したとおりにインターフェイスを使用することを前提にして、ほとんどすべてがPropertyChangedサブスクライバです(一部はフレームワークの一部として実際に配信されます)名。 MyIDというプロパティが変更されたという通知を送信した場合、別のコンポーネントがプロパティIDを参照しているときには、通知が表示され、名前が比較され、「この通知は私のものではありません」と結論づけられます。

2

プロパティの名前と正確に一致させたい場合は、nameofという新しいC#6機能を使用できます。 nameofの機能は、nameofを1語に使用する主な利点がリファクタリングであると言えるため、すべてのご質問にお答えします。 「IDがあまりにもプロパティの名前を変更しますか、それがコンパイルを破るが、次doesnのでしょうリネーム例として

NotifyPropertyChanged(nameof(ID)); 

:そして、「リファクタリング」は、あなたの質問に基づいて探している言葉でありますt:

NotifyPropertyChanged("ID") 
+0

C#6はそれほど多くを追加しません:C#5はすでに '[CallerMemberName]'属性を提供しています。 'NotifyPropertyChanged();'は、タイプミスの余地がさらに少なくなります。つまり、これはコメントでなければならない、それは質問に答えることを試みない。 – hvd

+1

@hvdはい。しかし、私にとって 'nameof'の使用例は、' INotifyPropertyChanged'インターフェースを使って作業するときです。 –

+1

@hvdこれは実際にはたくさん追加されます。データをより効果的にリンクすることができます。 'nameof'を使うときは、右クリックしてすべての参照を見つけてください。この「CallerMemberName」よりもはるかに優れています。 – Alexandru

1

プロパティの名前と正確に一致する必要があります。副作用では、PropertyChangedを呼び出す前に値が実際に変更されたことを確認する必要があります。これは、これが比較的高価な呼び出しであるためです(WPFはプロパティが変更されていないことを知らないでしょう)。 VS2015では、nameof演算子を使用することもできます。

+0

一致しないとどうなりますか? – Denis

+0

@Denis、UIは更新されません。バインディングは名前によるものです。 – SledgeHammer

関連する問題