附加路由事件时未调用添加处理程序方法

Add Handler method not being called when Routed Event is attached

我正在尝试创建附加行为以将自动完成列表添加到标准 TextBox 控件。我的目标是每次引发 TextChanged 事件时,我的 AutoCompleteBehavior class 都会创建一个弹出窗口并用潜在的自动完成结果填充它。 为了获得这些结果,我的 AutoCompleteBehavior 声明了以下事件:

Public Shared ReadOnly AutoCompleteListRequestedEvent As RoutedEvent =
                  EventManager.RegisterRoutedEvent("AutoCompleteListRequested",
                  RoutingStrategy.Bubble,
                  GetType(AutoCompleteListRequestedEventHandler), GetType(AutoCompleteBehavior))

以上为附加事件,用法如下:

<TextBox lib:AutoCompleteBehavior.AutoCompleteListRequested="EventHandlerHere"/>

想法是当TextChanged被引发时,AutoCompleteBehavior.AutoCompleteListRequested也会被引发,它要求执行程序为当前输入提供一个建议列表。

为此,我必须在我的附加事件附加到所述 TextBox 后立即连接到 TextBox.TextChanged 事件。根据 Microsoft 我应该能够声明一个子 Add*HandlerRemove*Handler 其中“*”是附加事件的名称,并且只要附加事件被添加或从一个元素中移除。 所以在事件声明的正下方我有:

        Public Shared Sub AddAutoCompleteListRequestedHandler(TB As TextBox, handler As AutoCompleteListRequestedEventHandler)
            'Code to hook into TextBox.TextChanged
        End Sub

        Public Shared Sub RemoveAutoCompleteListRequestedHandler(TB As TextBox, handler As AutoCompleteListRequestedEventHandler)
            'Code to unhook fromTextBox.TextChanged
        End Sub

我的问题是 AddAutoCompleteListRequestedHandler 从未被调用过。如果我调用 TextBox.RaiseEvent 引发 AutoCompleteListRequested,XAML 中定义的事件处理程序确实会被调用(因此事件被附加),但似乎我的 AddAutoCompleteListRequestedHandler 被完全跳过。

作为最后的说明,我发现这个问题 here 似乎在描述同样的问题(我的代码也像他一样在 dll 中),但它已经两年了,而且从未得到回答。

XAML 处理器在连接事件处理程序时不会调用您的静态方法。

如果您想在 TextBox 引发 TextChanged 事件时执行某些操作,您最好实现附加行为并连接到 TextChanged 事件PropertyChangedCallbackOnAttached() 方法,具体取决于您创建的行为类型。

有关附加行为的更多信息,请参阅我的回答