0

基本的に私はこのようなことをしたい:

public static void OnPropertyChanged(this INotifyPropertyChanged changedObject, string propertyName)
{
    var handler = changedObject.PropertyChanged;
    if (handler != null)
    {
        var e = new PropertyChangedEventArgs(propertyName);
        handler(changedObject, e);
    }
}

これにより、「System.ComponentModel.INotifyPropertyChanged.PropertyChanged は += または -=" の左側でのみ使用できます。

つまり、これを行うことで回避できます。

public static void RaisePropertyChanged(this PropertyChangedEventHandler handler, object sender, string propertyName)
{
    if (handler != null)
    {
        var e = new PropertyChangedEventArgs(propertyName);
        handler(sender, e);
    }
}

しかし、呼び出しコードはそれほど見栄えがよくありません。

PropertyChanged.RaisePropertyChanged(this, "Name");

対これ:

this.OnPropertyChanged("Name");

大したことではありませんが、インスタンスメソッドのように呼び出せるといいですね。

4

1 に答える 1

1

また、ガイドラインにも反しています。一般に、On* メソッドは、実装インスタンスの内部にある何かに基づいて処理を行うことを意図しています。一般に、これらのメソッドは仮想であるため、派生クラスでオーバーライドできます。したがって、外部に On* メソッドを持つことは意味がありません。あらゆる場所で恐ろしい null テストを行わずにイベントを発生させたい場合は、実際には RaiseEvent() 拡張メソッドを使用する必要があります。私はこれらの多くを書きましたが、すべてオーバーロードを持っているので、RaiseEvent(...) を持つことができ、メソッドにイベントの名前を含める必要はありません。これは、たとえば通常の EventHandler 型を使用する場合に特に簡単なので、同じ拡張メソッドをより多くのイベントに使用できます。

于 2009-05-24T10:05:44.327 に答える