我有一个有自定义事件的控件。
目前我将其定义为任何其他事件
Public Event ContentChanged As EventHandler
但今天我发现一篇文章他们有一种完全不同的处理方式
Shared ReadOnly contentChangedKey As New Object()
Public Custom Event ContentChanged As EventHandler
AddHandler(value As EventHandler)
Me.Events.AddHandler(contentChangedKey, value)
End AddHandler
RemoveHandler(value As EventHandler)
Me.Events.RemoveHandler(contentChangedKey, Value)
End RemoveHandler
RaiseEvent(sender As Object, e As EventArgs)
Dim contentChangedDelegate As EventHandler = _
Me.Events(contentChangedKey)
contentChangedDelegate(sender, e)
End RaiseEvent
End Event
第二种方式似乎过于复杂,它的第一个例子不是什么?
答案 0 :(得分:1)
它有过度复制:)
换句话说,你可以添加任何其他类型的处理,当envent发生或绑定时需要这样做。由于您正在控制添加,删除或引发事件处理程序时所采取的操作,因此您可以执行自定义操作。
例如,假设你有一个有5个按钮的控件。然而,除非正在处理事件X,否则其中一个按钮将无法使用。
使用自定义事件处理程序,您可以执行此操作:
Public Custom Event ContentChanged As EventHandler
AddHandler(value As EventHandler)
Me.Events.AddHandler(contentChangedKey, value)
Me.SpecialButton.visible = true
End AddHandler
RemoveHandler(value As EventHandler)
Me.Events.RemoveHandler(contentChangedKey, Value)
Me.SpecialButton.visible = false
End RemoveHandler
RaiseEvent(sender As Object, e As EventArgs)
Dim contentChangedDelegate As EventHandler = _
Me.Events(contentChangedKey)
contentChangedDelegate(sender, e)
End RaiseEvent
End Event
如果您没有自定义事件处理程序,那么执行此类逻辑将非常困难。这一切都归结为粒度;你需要多少控制力?
当然,您需要确保在AddHandler
或RemoveHandler
被触发时,您希望在那里使用的任何内容都是真实的。 这是一个过于简化的示例