0

我有一个具有自定义事件的控件。

目前我像任何其他事件一样定义它

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

第二种方法似乎过于复杂,第一个示例没有做什么?

4

1 回答 1

1

它过于复杂:)

换句话说,您可以在其中添加在事件发生或绑定时需要完成的任何其他类型的处理。由于您正在控制添加、删除或引发事件处理程序时采取的操作,因此您可以执行自定义操作。

例如,假设您有一个有 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

如果您没有自定义事件处理程序,那么执行这种逻辑将非常困难。这一切都归结为粒度。你需要多少控制?

当然,您需要确保当触发AddHandleror时RemoveHandler,您希望在其中使用的任何内容都是真实的。这是一个过于简化的例子

于 2013-07-25T14:17:35.257 回答