2011-12-19 65 views
1

说,我有一个ObservableCollection的ObservableCollection和处理程序

Class Person 
    Name 
    Event DidSomething 

Class House 
    WithEvents People as ObservableCollection(of Person) 

    Sub OnPersonDidSomething(p as Person) 
    Console.WriteLine("{0} did something", p.Name) 

现在,我应该如何实现这个的ObservableCollection的处理程序?

Private Sub People_CollectionChanged(_ 
    sender As Object, _ 
    e As NotifyCollectionChangedEventArgs) Handles People.CollectionChanged 

Select Case e.Action 
    Case Specialized.NotifyCollectionChangedAction.Add 
    For Each mp As Person In e.NewItems 
     RemoveHandler mp.DidSomething, AddressOf OnPersonDidSomething 
     AddHandler mp.DidSomething, AddressOf OnPersonDidSomething 
    Next mp 

    Case Specialized.NotifyCollectionChangedAction.Remove 
    For Each mp As Person In e.NewItems 
     RemoveHandler mp.DidSomething, AddressOf OnPersonDidSomething 
    Next mp 
End Select 

End Sub 

它正确吗?什么为Move, Replace, Reset行动?

回答

2

这是正确的。

对于Replace,您应该从旧项目中删除处理程序并将它们添加到新项目中。

对于Reset,您应该恐慌,因为您不知道删除或添加了哪些项目。

+0

对于重置,我应该删除所有OldItem的处理程序,并添加一个新的实际的? – serhio 2011-12-19 17:18:38

+0

好问题。你应该删除并添加到新旧项目,但我相信他们将是空的。为避免内存泄漏,您可能需要维护一个单独的已知项目集合以从中删除(然后添加到集合中的所有内容) – SLaks 2011-12-19 17:18:56

+1

查看源代码,只有在调用Clear()时才会引发Reset,并且不会给你旧的物品。要么不支持Clear()或者创建一个单独的列表来跟踪旧的项目。 – SLaks 2011-12-19 17:20:43