.NETはデリゲートを実際に保持する舞台裏でプライベートインスタンス変数を作成するため、宣言クラスのイベントにのみアクセスできます。これをやって…
public event EventHandler MyPropertyChanged;
実際にこれを行っています。
private EventHandler myPropertyChangedDelegate;
public event EventHandler MyPropertyChanged
{
add { myPropertyChangedDelegate += value; }
remove { myPropertyChangedDelegate -= value; }
}
そしてこれをしています...
MyPropertyChanged(this, EventArgs.Empty);
これは...
myPropertyChangedDelegate(this, EventArgs.Empty);
したがって、(明らかに)宣言クラス内からのみプライベートデリゲートインスタンス変数にアクセスできます。
規約は、宣言クラスでこのようなものを提供することです。
protected virtual void OnMyPropertyChanged(EventArgs e)
{
EventHandler invoker = MyPropertyChanged;
if(invoker != null) invoker(this, e);
}
その後OnMyPropertyChanged(EventArgs.Empty)
、そのクラス内の任意の場所または継承階層の下から呼び出して、イベントを呼び出すことができます。