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

但是我如何对一对多的关系做类似的事情呢?这是我到目前为止所拥有的:

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 回答