我为UserControl创建了一个基类,在其中定义了以下路由事件
Public Shared ReadOnly ItemValueChangedEvent As RoutedEvent = EventManager.RegisterRoutedEvent("ItemValueChanged", RoutingStrategy.Bubble, GetType(EditValueChangedEventHandler), GetType(BaseControl))
Public Custom Event ItemValueChanged As EditValueChangedEventHandler
AddHandler(value As EditValueChangedEventHandler)
[AddHandler](ItemValueChangedEvent, value)
End AddHandler
RemoveHandler(value As EditValueChangedEventHandler)
[RemoveHandler](ItemValueChangedEvent, value)
End RemoveHandler
RaiseEvent(sender As Object, e As EditValueChangedEventArgs)
Dim newEventArgs As EditValueChangedEventArgs = New EditValueChangedEventArgs(e.OldValue, e.NewValue) With {.RoutedEvent = ItemValueChangedEvent}
[RaiseEvent](newEventArgs)
End RaiseEvent
End Event
然后我定义了一个可重写的子对象,以便能够从后代引发事件:
Protected Overridable Sub OnItemChanged(sender As Object, e As EditValueChangedEventArgs)
RaiseEvent ItemValueChanged(sender, e)
End Sub
在我的后代UserControl中,我有一个ComboBox绑定到依赖项属性
Public Shared ReadOnly ItemProperty As DependencyProperty =
DependencyProperty.Register("Item",
GetType(CustomItem), GetType(DescendantControl),
New UIPropertyMetadata(Nothing))
Public Property Item As CustomItem
Get
Return GetValue(ItemProperty)
End Get
Set(ByVal value As CustomItem)
SetValue(ItemProperty, value)
End Set
End Property
然后我像这样覆盖基类子:
Protected Overrides Sub OnItemChanged(sender As Object, e As EditValueChangedEventArgs)
MyBase.OnItemChanged(sender, e)
End Sub
在使用UserControl的窗口中,我已将Item属性绑定到具有Mode =“ TwoWay”和UpdateSourceTrigger =“ PropertyChanged”的ViewModel上的属性。
当我在ComboBox中选择一个项目时,将在更新ViewModel属性之前引发该事件,并且除非将焦点从ComboBox移开,否则绑定不会触发。