Ви можете отримати доступ до події лише у класі декларування, оскільки .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)
з будь-якого класу цього класу чи нижче спадкової спадщини, щоб викликати подію.