 
 package mx.collections {
     import flash.events.EventDispatcher;
+    import flash.utils.Dictionary;
 
     import mx.binding.utils.ChangeWatcher;
     import mx.core.mx_internal;

                    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);
        }
    }
}

    import mx.events.CollectionEventKind;
    import mx.events.PropertyChangeEvent;

    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();
            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);
        }

