【发布时间】:2010-11-23 12:00:57
【问题描述】:
我有一个这样声明的路由事件(名称已更改以保护无辜者):
public class DragHelper : DependencyObject {
public static readonly RoutedEvent DragCompleteEvent = EventManager.RegisterRoutedEvent(
"DragComplete",
RoutingStrategy.Bubble,
typeof(DragRoutedEventHandler),
typeof(DragHelper)
);
public static void AddDragCompleteHandler( DependencyObject dependencyObject, DragRoutedEventHandler handler ) {
UIElement element = dependencyObject as UIElement;
if (element != null) {
element.AddHandler(DragCompleteEvent, handler);
}
}
public static void RemoveDragCompleteHandler( DependencyObject dependencyObject, DragRoutedEventHandler handler ) {
UIElement element = dependencyObject as UIElement;
if (element != null) {
element.RemoveHandler(DragCompleteEvent, handler);
}
}
相当标准的东西。在 XAML 中,我有一个包含单个自定义控件的 DataTemplate。我正在尝试将此事件(以及其他一些附加属性)附加到控件:
<DataTemplate ...>
<My:CustomControl
My:DragHelper.IsDragSource="True"
My:DragHelper.DragComplete="DragCompleteHandler" />
</DataTemplate>
这无法产生预期的结果。具体来说,在调用为 DragComplete 事件调用 RaiseEvent() 的代码时,从不调用处理程序。事实上,任何其他自定义路由事件的处理程序也不是在此 XAML 文件的其他地方挂钩。
我尝试更改路由事件的名称,并尝试将数据模板从一个带有 DataType 的模板切换为一个带有 x:Key 的模板。这对行为没有产生明显的变化。
但是,如果我将 My:CustomControl 更改为任何内置 WPF 控件,例如 TextBlock,则事件会完全按照我的预期触发。同样,如果我用我的项目中的任何其他自定义 UserControl 子类替换我的自定义控件,则行为将恢复为损坏的、无事件似乎要处理的状态。
这对我来说没有多大意义。我需要做一些具体的事情来让这个场景起作用吗?好像应该没关系。我想可能是我在所有自定义控件中所做的特定事情导致事件处理中断,但是到目前为止我尝试过的三个或四个自定义控件中没有看到任何共同点。
【问题讨论】:
标签: c# wpf user-controls attached-properties