/// <inheritdoc/> protected override void OnAttached() { if (EventName == null) { throw new ArgumentException($"The EventName property must be set on behavior '{GetType().FullName}'."); } var eventOwnerType = EventOwnerType ?? AssociatedObject.GetType(); var uiElement = AssociatedObject as UIElement; var routedEvents = EventManager.GetRoutedEvents().Where(x => x.Name == EventName && x.OwnerType.IsAssignableFrom(eventOwnerType)).ToArray(); if (uiElement != null && routedEvents.Length > 0) { if (routedEvents.Length > 1) { throw new NotImplementedException("TODO: several events found, find a way to decide the most relevant one."); } routedEvent = routedEvents.First(); uiElement.AddHandler(routedEvent, routedEventHandler); } else { var eventInfo = AssociatedObject.GetType().GetEvent(EventName); if (eventInfo == null) { throw new InvalidOperationException($"Impossible to find a valid event named '{EventName}'."); } eventHandler = AnonymousEventHandler.RegisterEventHandler(eventInfo, AssociatedObject, OnEvent); } }
/// <inheritdoc/> protected override void OnDetaching() { if (routedEvent != null) { AssociatedObject.RemoveHandler(routedEvent, routedEventHandler); routedEvent = null; } else if (eventHandler != null) { AnonymousEventHandler.UnregisterEventHandler(eventHandler); eventHandler = null; } }