Определите интерфейс, который содержит событие маршрутизации, и имплементировать этот интерфейс в каждом классе, где необходимо использовать это событие. Затем в каждом классе можно определить статический член, который будет хранить все подписки на событие в этом классе. Каждый раз, когда событие происходит, класс будет обновлять свои подписки и оповещать всех заинтересованных слушателей.
public interface IBase
{
event EventHandler<RoutedEventArgs> MyRoutedEvent;
}
public class Base<T> : ReactiveUserControl<T>, IBase where T : class
{
public static event EventHandler<RoutedEventArgs> MyRoutedEvent;
event EventHandler<RoutedEventArgs> IBase.MyRoutedEvent
{
add { MyRoutedEvent += value; }
remove { MyRoutedEvent -= value; }
}
protected static void OnMyRoutedEvent(object sender, RoutedEventArgs e)
{
MyRoutedEvent?.Invoke(sender, e);
}
}
Concrete:
public class Concrete : Base<ConcreteViewModel>, IBase
{
public static event EventHandler<RoutedEventArgs> MyRoutedEvent;
event EventHandler<RoutedEventArgs> IBase.MyRoutedEvent
{
add { MyRoutedEvent += value; }
remove { MyRoutedEvent -= value; }
}
protected override void OnInitialized()
{
base.OnInitialized();
MyRoutedEvent += OnMyRoutedEvent;
}
protected override void OnDispose()
{
MyRoutedEvent -= OnMyRoutedEvent;
base.OnDispose();
}
}