     }
     
     /**
+     *  @private
+     *  True if we are updating a renderer currently. 
+     *  We keep track of this so we can ignore any dataProvider collectionChange
+     *  UPDATE events while we are updating a renderer just in case we try to update 
+     *  the rendererInfo of the same renderer twice.  This can happen if setting the 
+     *  data in an item renderer causes the data to mutate and issue a propertyChange
+     *  event, which causes an collectionChange.UPDATE event in the dataProvider.  This 
+     *  can happen for components which are being treated as data because the first time 
+     *  they get set on the renderer, they get added to the display list, which may 
+     *  cause a propertyChange event (if there's a child with an ID in it, that causes 
+     *  a propertyChange event) or the data to morph in some way.
+     */
+    private var renderersBeingUpdated:Boolean = false;
+    
+    /**
      *  @private 
      *  Sets the renderer's data, owner and labelText properties. 
      *  Then, gives the "true" owner a chance to call update the 

        //owner a chance to update the renderer. 
        else if (renderer.owner != this)
            IItemRendererOwner(renderer.owner).updateRenderer(renderer);
                        
    }

    

            
            case CollectionEventKind.UPDATE:
            {
                // if a renderer is currently being updated, let's 
                // just ignore any UPDATE events.
                if (renderersBeingUpdated)
                    break;
                
                //update the renderer's data and data-dependant
                //properties. 
                for (var i:int = 0; i < event.items.length; i++)
