Você pode acessar apenas um evento na classe declarante, pois o .NET cria variáveis de instância privadas nos bastidores que realmente mantêm o delegado. Fazendo isso..
public event EventHandler MyPropertyChanged;
está realmente fazendo isso;
private EventHandler myPropertyChangedDelegate;
public event EventHandler MyPropertyChanged
{
add { myPropertyChangedDelegate += value; }
remove { myPropertyChangedDelegate -= value; }
}
e fazendo isso ...
MyPropertyChanged(this, EventArgs.Empty);
é realmente isso ...
myPropertyChangedDelegate(this, EventArgs.Empty);
Portanto, você pode (obviamente) acessar apenas a variável de instância delegada privada de dentro da classe declarante.
A convenção é fornecer algo assim na classe declarante.
protected virtual void OnMyPropertyChanged(EventArgs e)
{
EventHandler invoker = MyPropertyChanged;
if(invoker != null) invoker(this, e);
}
Você pode ligar OnMyPropertyChanged(EventArgs.Empty)
de qualquer lugar nessa classe ou abaixo da hierarquia de herança para invocar o evento.