Вы можете получить доступ только к событию в объявленном классе, поскольку .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)
из любого места в этом классе или ниже иерархии наследования, чтобы вызвать событие.