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

2 番目の方法は非常に複雑に思えますが、最初の例では行われず、何が行われるのでしょうか??

4

1 に答える 1

1

複雑すぎます:)

つまり、イベントが発生したとき、またはイベントにバインドされたときに実行する必要がある他の種類の処理をそこに追加できます。イベントハンドラーが追加、削除、または発生したときに実行されるアクションを制御しているため、カスタムのことができます。

たとえば、5 つのボタンを持つコントロールがあるとします。ただし、イベント X が処理されていない限り、ボタンの 1 つが役に立たないでしょう。

カスタム イベント ハンドラーを使用すると、次のことができます。

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

カスタム イベント ハンドラがなければ、この種のロジックを実行するのは非常に困難です。それはすべて粒度に帰着します。どれくらいのコントロールが必要ですか?

もちろん、AddHandlerorRemoveHandlerがトリガーされているときに、そこで使用すると予想されるものが本物であることを確認する必要があります。これは非常に単純化された例です

于 2013-07-25T14:17:35.257 に答える