我有一个继承自 ItemsControl 的自定义用户控件。通过它的 ItemTemplate,它从 ObservableCollection 为每个附加的 ViewModel 创建一个 ChildControl。
public class ChildControl : FrameworkElement
{
public static readonly RoutedEvent CreatedEvent = EventManager.RegisterRoutedEvent(
nameof(Created),
RoutingStrategy.Bubble,
typeof(RoutedEventHandler),
typeof(ChildControl));
public static readonly RoutedEvent RemovedEvent = EventManager.RegisterRoutedEvent(
nameof(Removed),
RoutingStrategy.Bubble,
typeof(RoutedEventHandler),
typeof(ChildControl));
public ChildControl
{
Loaded += OnLoaded;
Unloaded += OnUnloaded;
}
public event RoutedEventHandler Created
{
add => AddHandler(CreatedEvent, value);
remove => RemoveHandler(CreatedEvent, value);
}
public event RoutedEventHandler Removed
{
add => AddHandler(RemovedEvent, value);
remove => RemoveHandler(RemovedEvent, value);
}
private void OnLoaded(object sender, RoutedEventArgs e)
{
RaiseEvent(new RoutedEventArgs(CreatedEvent));
}
private void OnUnloaded(object sender, RoutedEventArgs e)
{
RaiseEvent(new RoutedEventArgs(RemovedEvent));
}
}
和 CustomItemsControl
public class CustomItemsControl : ItemsControl
{
public CustomItemsControl()
{
AddHandler(ChildControl.CreatedEvent, new RoutedEventHandler(OnCreatedEvent));
AddHandler(ChildControl.RemovedEvent, new RoutedEventHandler(OnRemovedEvent));
}
private void OnCreatedEvent(object sender, RoutedEventArgs e)
{
// stuff
}
private void OnRemovedEvent(object sender, RoutedEventArgs e)
{
// stuff
}
}
除了 RemovedEvent 处理程序之外,一切正常。当事件在 ChildControl 的 Unloaded 事件处理程序中引发时,CustomItemsControl 不会捕获该事件。但是,当在 Loaded 事件处理程序中调用 RemovedEvent 时,它会被 CustomItemsControl 捕获。所以它证明一切都很好。
我做错了什么还是意味着从 Unloaded 事件处理程序中调用的 RoutedEvents 没有被设计冒泡?