1

このような 1 対 1 の関係からイベントをバブルアップできます

Public Class Husband

    Public WithEvents Wife As Wife

    Public Sub WifeChangedLastName() Handles Wife.LastNameChanged
        MsgBox("Wife Changed Last Name")
    End Sub

End Class

Public Class Wife

    Public _LastName As String
    Public Property LastName As String
        Get
            Return Me._LastName
        End Get
        Set(ByVal Value As String)
            Me._LastName = Value
            Raise Event LastNameChanged(Me, EventArgs.Empty)
        End Set
    End Property

    Public Event LastNameChanged As EventHandler

End Class

しかし、1 対多の関係で同様のことを行うにはどうすればよいでしょうか。これが私がこれまでに持っているものです:

Public Class Organization

    Public WithEvents Group As New Group 'A one-to-one relationship

    Public Sub PersonAddedToGroup() Handles Group.PersonAdded
        MsgBox("A person has been added to the group.") 'This works
    End Sub

    'I want to do something here when a person's name changes

End Class

Public Class Group

    Public WithEvents People As List(Of Person) 'A one-to-many relationship

    Public Sub Add(ByVal Person As Person)
        Me.People.Add(Person)

        RaiseEvent PersonAdded(Me, EventArgs.Empty)      
    End Sub

    Public Event PersonAdded As EventHandler

End Class

Public Class Person

    Private _Name As String
    Public Property Name As String
        Get
            Return Me._Name
        End Get
        Set(ByVal Value As String)
            Me._Name = Value
            RaiseEvent PersonChanged(Me, EventArgs.Empty)
        End Set
    End Property

    Public Event PersonChanged As EventHandler

End Class

組織内で PersonChanged イベントを処理したいと思います。どうすればいいですか?

4

2 に答える 2

1

人ごとにイベントハンドラーを追加する必要があります...ただし、それらはすべて同じ方法で処理できます。これが私が提案するものです。

  1. PersonAdded追加された新しいPersonオブジェクトを渡すようにイベントを変更します。これを含めるには、イベント/ハンドラーを宣言した場所を更新する必要があると思います...

    'Inside Group.Add(person As Person)
    RaiseEvent PersonAdded(Me, person)  
    
  2. のイベント ハンドラで、その特定の人PersonAddedのイベントをサブスクライブします。PersonChanged

    Public Sub PersonAddedToGroup(person As Person) Handles Group.PersonAdded
        MsgBox("A person has been added to the group.") 'This works
        AddHandler person.PersonChanged, AddressOf OnPersonChanged
    End Sub
    

そのようなものは、あなたが望むものを達成するはずです (これは大まかなコードであり、VS でのテストではありません)。人を追加したり削除したりする場合は、イベントがメモリ リークにつながる可能性があることを覚えておいてください (つまりRemoveHandler、イベントをサブスクライブしているオブジェクトがなくなったときに呼び出したいと思うでしょう。この場合Organization、おそらくPersonオブジェクトよりも長持ちするので、それほど重要ではありません)。私が間違っていなければ、問題です。

于 2013-11-05T23:36:42.527 に答える
0

LarsTech から回答が見つかりました。彼は、プロパティ変更イベントを処理する (System.ComponentModel.)BindingList を使用することを提案しました。

于 2013-11-06T00:16:06.590 に答える