Merge pull request #900 from Blewzman/FixAggregateExceptionGetBaseException
[mono.git] / mcs / class / System / System.ComponentModel / BindingList.cs
index aaa885d5d9a698570d0fd2abca5d7f8dd7efb0ed..b4c0ce8b69b1cb2ba325bf0bd81adaa229b173eb 100644 (file)
@@ -20,8 +20,6 @@
 // Copyright (c) 2007 Novell, Inc.
 //
 
-#if NET_2_0
-
 using System;
 using System.Collections;
 using System.Collections.Generic;
@@ -181,9 +179,6 @@ namespace System.ComponentModel {
                        Add (new_obj);
                        pending_add_index = IndexOf (new_obj);
                        add_pending = true;
-
-                       if (raise_list_changed_events)
-                               OnListChanged (new ListChangedEventArgs (ListChangedType.ItemAdded, pending_add_index));
                        
                        return new_obj;
                }
@@ -212,7 +207,11 @@ namespace System.ComponentModel {
                protected override void ClearItems ()
                {
                        EndNew (pending_add_index);
-
+                       if (type_raises_item_changed_events) {
+                               foreach ( T item in base.Items ) {
+                                       (item as INotifyPropertyChanged).PropertyChanged -= Item_PropertyChanged;
+                               }
+                       }
                        base.ClearItems ();
 
                        OnListChanged (new ListChangedEventArgs (ListChangedType.Reset, -1));
@@ -242,6 +241,14 @@ namespace System.ComponentModel {
 
                        if (raise_list_changed_events)
                                OnListChanged (new ListChangedEventArgs (ListChangedType.ItemAdded, index));
+
+                       if (item != null && type_raises_item_changed_events)
+                               (item as INotifyPropertyChanged).PropertyChanged += Item_PropertyChanged;
+               }
+
+               void Item_PropertyChanged (object item, PropertyChangedEventArgs args)
+               {
+                       OnListChanged (new ListChangedEventArgs (ListChangedType.ItemChanged, base.IndexOf ((T) item)) );
                }
 
                protected virtual void OnAddingNew (AddingNewEventArgs e)
@@ -262,7 +269,9 @@ namespace System.ComponentModel {
                                throw new NotSupportedException ();
 
                        EndNew (pending_add_index);
-
+                       if (type_raises_item_changed_events) {
+                               (base[index] as INotifyPropertyChanged).PropertyChanged -= Item_PropertyChanged;
+                       }
                        base.RemoveItem (index);
 
                        if (raise_list_changed_events)
@@ -286,6 +295,10 @@ namespace System.ComponentModel {
 
                protected override void SetItem (int index, T item)
                {
+                       if (type_raises_item_changed_events) {
+                               (base[index] as INotifyPropertyChanged).PropertyChanged -= Item_PropertyChanged;
+                               (item as INotifyPropertyChanged).PropertyChanged += Item_PropertyChanged;
+                       }
                        base.SetItem (index, item);
 
                        OnListChanged (new ListChangedEventArgs (ListChangedType.ItemChanged, index));
@@ -364,4 +377,3 @@ namespace System.ComponentModel {
 
 }
 
-#endif