             var watcher:ChangeWatcher = ChangeWatcher.watch(item, chain, new Closure(item, onComplexValueChanged).callFunctionOnObject, false, true);
             if(watcher)
             {
-                _complexFieldWatchers.push(watcher);
-            }
+                addWatcher(watcher, item);
+            }
+        }
+
+        private function addWatcher(watcher:ChangeWatcher, forItem:Object):void
+        {
+            if(!_complexFieldWatchers[forItem])
+                _complexFieldWatchers[forItem] = [];
+            (_complexFieldWatchers[forItem] as Array).push(watcher);
+        }
+
+        private function onComplexValueChanged(item:Object):void
+        {
+            dispatchEvent(PropertyChangeEvent.createUpdateEvent(item, null, null, null));
+        }
+
+        private function get sortFields():Array
+        {
+            return _listCollection && _listCollection.sort ? _listCollection.sort.fields : null;
+        }
+
+        mx_internal function set list(value:IList):void
+        {
+            if(_list != value)
+            {
+                stopWatchingForComplexFieldChanges();
+
+                _list = value;
+                _listCollection = value as ICollectionView;
+            }
+        }
+
+        protected function get list():IList
+        {
+            return _list;
+        }
+
+        private function watchListForChanges():void
+        {
+            if(list)
+                list.addEventListener(CollectionEvent.COLLECTION_CHANGE, onCollectionChanged, false, 0, true);
+        }
+
+        private function unwatchListForChanges():void
+        {
+            if(list)
+                list.removeEventListener(CollectionEvent.COLLECTION_CHANGE, onCollectionChanged);
         }
 
         private function onCollectionChanged(event:CollectionEvent):void

                    watchArrayOfItems(event.items);
                    break;
                }
            }
        }

        private function onComplexValueChanged(item:Object):void
        {
            dispatchEvent(PropertyChangeEvent.createUpdateEvent(item, null, null, null));
        }

        private function get sortFields():Array
        {
            return _listCollection && _listCollection.sort ? _listCollection.sort.fields : null;
        }

        mx_internal function set list(value:IList):void
        {
            if(_list != value)
            {
                stopWatchingForComplexFieldChanges();

                _list = value;
                _listCollection = value as ICollectionView;
            }
        }

        protected function get list():IList
        {
            return _list;
        }

        private function watchListForChanges():void
        {
            if(list)
                list.addEventListener(CollectionEvent.COLLECTION_CHANGE, onCollectionChanged, false, 0, true);
        }

        private function unwatchListForChanges():void
        {
            if(list)
                list.removeEventListener(CollectionEvent.COLLECTION_CHANGE, onCollectionChanged);
        }
    }
}


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

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