     import mx.events.CollectionEventKind;
     import mx.events.PropertyChangeEvent;
 
-    public class ComplexFieldChangeWatcher extends EventDispatcher {
-
-        private var _complexFieldWatchers:Vector.<ChangeWatcher> = new Vector.<ChangeWatcher>();
+    public class ComplexFieldChangeWatcher extends EventDispatcher
+    {
+        private var _complexFieldWatchers:Dictionary = new Dictionary(true);
         private var _list:IList;
         private var _listCollection:ICollectionView;
 
         public function stopWatchingForComplexFieldChanges():void
         {
             unwatchListForChanges();
-
-            for each(var watcher:ChangeWatcher in _complexFieldWatchers)
-            {
-                watcher.unwatch();
-            }
-
-            _complexFieldWatchers.length = 0;
+            unwatchAllItems();
+        }
+
+        private function unwatchAllItems():void
+        {
+            for each(var item:Object in _complexFieldWatchers)
+            {
+                unwatchItem(item);
+                delete _complexFieldWatchers[item];
+            }
+        }
+
+        private function unwatchArrayOfItems(items:Array):void
+        {
+            for(var i:int = 0; i < items.length; i++)
+            {
+                unwatchItem(items[i]);
+            }
+        }
+
+        private function unwatchItem(item:Object):void
+        {
+            var watchersForItem:Array = _complexFieldWatchers[item] as Array;
+            while(watchersForItem && watchersForItem.length)
+            {
+                var watcher:ChangeWatcher = watchersForItem.pop() as ChangeWatcher;
+                if(watcher)
+                    watcher.unwatch();
+            }
         }
 
         public function startWatchingForComplexFieldChanges():void
         {
             watchListForChanges();
-
             watchItems(list);
         }
 


package mx.collections {
    import flash.events.EventDispatcher;

    import mx.binding.utils.ChangeWatcher;
    import mx.core.mx_internal;

                    watchArrayOfItems(event.items);
                    break;
                }
                case CollectionEventKind.REMOVE: {
                    unwatchArrayOfItems(event.items);
                    break;
                }
            }
        }
    }
}
