Также возможно переопределить Panel.CreateUIElementCollection (...), поэтому он возвращает пользовательский тип, производный от UIElementCollection. В UIElementCollection вы можете переопределить Добавить, Удалить и т. Д.
public class CustomPanel: Panel
{
protected override UIElementCollection CreateUIElementCollection(FrameworkElement logicalParent)
{
ObservableUIElementCollection uiECollection = new ObservableUIElementCollection(this, logicalParent);
uiECollection.RaiseAddUIElement += OnUIElementAdd;
return uiECollection;
}
}
public class ObservableUIElementCollection : UIElementCollection
{
public ObservableUIElementCollection(UIElement visualParent, FrameworkElement logicalParent)
: base(visualParent, logicalParent)
{
}
public event EventHandler<UIElement> RaiseAddUIElement;
public override int Add(UIElement element)
{
OnRiseAddUIElementEvent(element);
return base.Add(element);
}
protected virtual void OnRiseAddUIElementEvent(UIElement e)
{
// copy to avoid race condition
EventHandler<UIElement> handler = RaiseAddUIElement;
if (handler != null)
handler(this, e);
}
}