【问题标题】:WithEvents LinkedList is it Impossible?WithEvents LinkedList 是不可能的吗?
【发布时间】:2011-01-24 01:46:29
【问题描述】:

WithEventsCollection - VB.NET 的最佳方法是什么?

您对下面的代码有什么意见吗(跳过Nothing 验证)?

问题是当我在我可以设置的For Each 块中获取LinkedListNode(Of Foo)myNode.Value = something,这是一个处理程序泄漏...

-在这种情况下我可以覆盖 FooCollection 的 GetEnumerator 吗?
-不。 :( 原因 NotInheritable Class LinkedListNode(Of T)

Class Foo
  Public Event SelectedChanged As EventHandler
End Class

Class FooCollection
  Inherits LinkedList(Of Foo)
  Public Event SelectedChanged As EventHandler

  Protected Overloads Sub AddFirst(ByVal item As Foo)
    AddHandler item.SelectedChanged, AddressOf OnSelectedChanged
    MyBase.AddFirst(item)
  End Sub

  Protected Overloads Sub AddLast(ByVal item As Foo)
    AddHandler item.SelectedChanged, AddressOf OnSelectedChanged
    MyBase.AddLast(item)
  End Sub

  ' ------------------- '

  Protected Overloads Sub RemoveFirst()
    RemoveHandler MyBase.First.Value.SelectedChanged, _
                         AddressOf OnSelectedChanged
    MyBase.RemoveFirst()
  End Sub

  Protected Overloads Sub RemoveLast(ByVal item As Foo)
    RemoveHandler MyBase.Last.Value.SelectedChanged, _
                        AddressOf OnSelectedChanged
    MyBase.RemoveLast()
  End Sub

  ' ------------------- '

  Protected Sub OnSelectedChanged(ByVal sender As Object, ByVal e As EventArgs)
    RaiseEvent SelectedChanged(sender, e)
  End Sub
End Class

【问题讨论】:

    标签: .net vb.net collections


    【解决方案1】:

    主要问题是您无法正确覆盖 GetEnumerator 函数。在这种情况下,我将创建一个不直接从 LinkedList 继承而只使用一个作为私有字段的类:

    Class FooCollection
        Implements ICollection(Of Foo)
    
        Private list As New LinkedList(Of Foo)
    
        Public Sub AddFirst(ByVal item As Foo)
            AddHandler item.SelectedChanged, AddressOf OnSelectedChanged
            list.AddFisrt(item)
        End Sub
    
        ...
    
    End Class
    

    这将需要更多的编码,因为您需要实现所有功能,而不仅仅是您想要覆盖的功能,但实现起来很简单。

    【讨论】:

      【解决方案2】:

      你看过CollectionChangedEventManager吗?我今天在处理队列更改时遇到了这个问题。

      【讨论】:

        【解决方案3】:

        据我了解,没有简单的解决方案,因为集合只包含对对象的引用,因此无法知道集合所包含的对象的属性是否已更改。

        一般来说你必须选择:

        1:) 你让你的集合控制的对象触发事件。您可以在 Charles Petzold 的 this MSDN article 中找到一个示例实现。他定义了一个“ObservableNotifiableCollection”。

        2:) 如果集合包含的类型不在您的控制范围内(因此您不能自己实现 PropertyChangedEvent),您可以使用代理对象。您可以在此处找到示例实现:“Implement InotifyPropertyChanged with Castle.DynamicProxy”。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-10-22
          • 1970-01-01
          • 1970-01-01
          • 2018-12-05
          • 1970-01-01
          • 2015-12-21
          • 2013-04-10
          • 1970-01-01
          相关资源
          最近更新 更多