Public Class Thing
Private _flag As Boolean
Public Property Flag() As Boolean
Get
Return Me._flag
End Get
Set(ByVal value As Boolean)
If Me._flag <> value Then
Me._flag = value
Me.OnFlagChanged(EventArgs.Empty)
End If
End Set
End Property
Public Sub New()
Me.New(False)
End Sub
Public Sub New(ByVal flag As Boolean)
Me._flag = flag
End Sub
Public Event FlagChanged As EventHandler
Protected Overridable Sub OnFlagChanged(ByVal e As EventArgs)
RaiseEvent FlagChanged(Me, e)
End Sub
End Class
Public Class ThingCollection
Inherits System.Collections.ObjectModel.Collection(Of Thing)
Private _flaggedItems As New List(Of Thing)
Private _unflaggedItems As New List(Of Thing)
Public ReadOnly Property FlaggedItems() As Thing()
Get
Return Me._flaggedItems.ToArray()
End Get
End Property
Public ReadOnly Property UnflaggedItems() As Thing()
Get
Return Me._unflaggedItems.ToArray()
End Get
End Property
Protected Overrides Sub ClearItems()
Me._flaggedItems.Clear()
Me._unflaggedItems.Clear()
For Each item As Thing In Me.Items
RemoveHandler item.FlagChanged, AddressOf HandleFlagChanged
Next
MyBase.ClearItems()
End Sub
Protected Overrides Sub InsertItem(ByVal index As Integer, ByVal item As Thing)
Me.ProcessNewItem(item)
MyBase.InsertItem(index, item)
End Sub
Protected Overrides Sub RemoveItem(ByVal index As Integer)
Me.ProcessRemovedItem(Me.Items(index))
MyBase.RemoveItem(index)
End Sub
Protected Overrides Sub SetItem(ByVal index As Integer, ByVal item As Thing)
Me.ProcessRemovedItem(Me.Items(index))
Me.ProcessNewItem(item)
MyBase.SetItem(index, item)
End Sub
Private Sub HandleFlagChanged(ByVal sender As Object, ByVal e As EventArgs)
Dim item As Thing = DirectCast(sender, Thing)
If item.Flag Then
Me._unflaggedItems.Remove(item)
Me._flaggedItems.Add(item)
Else
Me._flaggedItems.Remove(item)
Me._unflaggedItems.Add(item)
End If
End Sub
Private Sub ProcessNewItem(ByVal item As Thing)
If item.Flag Then
Me._flaggedItems.Add(item)
Else
Me._unflaggedItems.Add(item)
End If
AddHandler item.FlagChanged, AddressOf HandleFlagChanged
End Sub
Private Sub ProcessRemovedItem(ByVal item As Thing)
If item.Flag Then
Me._flaggedItems.Remove(item)
Else
Me._unflaggedItems.Remove(item)
End If
RemoveHandler item.FlagChanged, AddressOf HandleFlagChanged
End Sub
End Class