2011-12-19 8 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

リセットの場合、すべてのOldItemsのハンドラを削除し、実際のものに新しいものを追加する必要がありますか? – serhio

+0

良い質問です。古いアイテムと新しいアイテムを削除して追加する必要がありますが、それらは空になると思います。メモリが漏れないようにするには、削除する既知のアイテムの別のコレクションを維持する必要があります(現在コレクション内のすべてのものに追加してください)。 – SLaks

+1

ソースを見ると、 'Reset'は' Clear() 'を呼び出すときにのみ発生し、あなたに古い商品を渡すことはありません。 'Clear()'をサポートしていないか、古いアイテムを追跡するために別のリストを作成してください。 – SLaks