代码之家  ›  专栏  ›  技术社区  ›  marc.d

如何将事件从通用列表中的子对象传递给父对象?

  •  0
  • marc.d  · 技术社区  · 17 年前

    下面是我的示例代码:

    Public Class Parent
        Private _TestProperty As String
        Private WithEvents _Child As IList(Of Child)
    
        Public Property Test() As String
            Get
                Return _TestProperty
            End Get
            Set(ByVal value As String)
                _TestProperty = value
            End Set
        End Property
    
        Public Property Child() As IList(Of Child)
            Get
                Return _Child
            End Get
            Set(ByVal value As IList(Of Child))
                _Child = value
            End Set
        End Property
    
        Private Sub eventHandler Handles _Child
    End Class
    
    Public Class Child
        Private _TestProperty As String
        Public Event PropertyChanged As EventHandler
    
        Friend Sub Notify()
            RaiseEvent PropertyChanged(Me, New EventArgs())
        End Sub
    
        Public Property Test() As String
            Get
                Return _TestProperty
            End Get
            Set(ByVal value As String)
                _TestProperty = value
                Notify()
            End Set
        End Property
    End Class
    

    如何处理父对象中某个子对象引发的事件? 在子对象上使用withEvents只会提供列表(of t)对象中的事件。

    蒂亚

    1 回复  |  直到 16 年前
        1
  •  1
  •   Sergey    17 年前

    如果我是您,我将使用聚合类型列表在父级中实现i list,但在i list.add上订阅子事件,在remove上取消订阅。类似这样的东西(对不起C语法)。

    class Child
    {
      public event EventHandler MyEvent;
    }
    
    class Parent : IList<Child>
    {
      List<Child> _list;
    
      // IList implementation
      // ...
      public void Add(Child item)
      {
         item.MyEvent += _ParentChildEventHandler;
         _list.Add(item);  
      }
    
      public void Remove(Child item)
      {
        item.MyEvent -= _ParentChildEventHandker;
        _list.Remove(item);
      }
    
      void _ParentChildEventHandler(object sender, EventArgs e)
      {
        Child child = (Child)sender;
    
        // write your event handling code here
      }
    }