2

単純な WPF ビュー ビューモデルの INotifyPropertyChanged インターフェイスを実装しました。

protected void RaisePropertyChanged(string propertyName)
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

GoodTextのセットで

this.RaisePropertyChanged("GoodText");

PropertyChanged イベントには、割り当てたことのないメソッドがあります。

配属されたときは?誰がやった?

編集:

ありがとう、すばらしいアドバイス、でもウィレムの答えは私が探していたものだと思います。

<Button Content="Button" Command="{Binding CheckButtonCommand}" />

それは(醜い疑似コード)のようなものです

PropertyChanged += Button.GiveMeThePropertyValue;

? では、バインディングはハンドラーを PropertyChanged イベントに追加したのでしょうか?

4

2 に答える 2

1

これが「フィールドのようなイベント」の魔法であり、デリゲートの魔法です。

まず、フィールドのようなイベントです。外部の呼び出し元には、 /アクセサーevent付きの -のように見えます。/でのみ使用できます。ただし、宣言型にはフィールドのように見えるため、デリゲートに直接アクセスできます。値の読み取りと割り当てを含みます。addremove+=-=

メソッドがどこから来たのかについて。それが (一種の)デリゲートです。これは実際.Invoke(...)にはデリゲート インスタンスにあります。しかし、これ.Invokeは暗黙的です。これは、たとえば次のように、どのデリゲートでも発生します。

Action<string> action = s => Console.WriteLine(s);
// following are identical (but with different values, obviously)
action("hello");
action.Invoke("world");

ただし、いくつかの提案があります。

1: 現時点では、非常に小さなスレッド レースが発生している可能性があります。私は提案します:

var handler = PropertyChanged;
if(handler != null) handler(this, ...);

2: 最近のコンパイラでは、リテラルを避けることができます:

protected void RaisePropertyChanged([CallerMemberName] string propertyName=null)
{
    var handler = PropertyChanged;
    if (handler != null)
    {
        handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

GoodTextこれにより、次のようにプロパティから簡単に呼び出すことができます。

this.RaisePropertyChanged();

コードが少ない = 間違いが少ない (名前のコピー/貼り付けなど)

于 2013-05-20T13:29:00.453 に答える