Solo puede acceder a un evento en la clase de declaración, ya que .NET crea variables de instancia privadas detrás de escena que realmente contienen al delegado. Haciendo esto..
public event EventHandler MyPropertyChanged;
en realidad está haciendo esto;
private EventHandler myPropertyChangedDelegate;
public event EventHandler MyPropertyChanged
{
add { myPropertyChangedDelegate += value; }
remove { myPropertyChangedDelegate -= value; }
}
y haciendo esto ...
MyPropertyChanged(this, EventArgs.Empty);
es en realidad esto ...
myPropertyChangedDelegate(this, EventArgs.Empty);
Por lo tanto, (obviamente) solo puede acceder a la variable de instancia de delegado privado desde la clase de declaración.
La convención es proporcionar algo como esto en la clase de declaración.
protected virtual void OnMyPropertyChanged(EventArgs e)
{
EventHandler invoker = MyPropertyChanged;
if(invoker != null) invoker(this, e);
}
Luego puede llamar OnMyPropertyChanged(EventArgs.Empty)
desde cualquier lugar de esa clase o debajo de la jerarquía de herencia para invocar el evento.