         if (gridDimensions.variableRowHeight && (rendererHeight != renderer.getPreferredBoundsHeight()))
             grid.invalidateDisplayList();
     }
+    
+    /**
+     *  @private
+     *  Return true if the specified item renderer was defined by an itemRendererFunction whose
+     *  value has changed.
+     */
+    private function itemRendererFunctionValueChanged(renderer:IGridItemRenderer):Boolean
+    {
+        const column:GridColumn = renderer.column;
+        if (!column || (column.itemRendererFunction === null))
+            return false;
+        
+        const factory:IFactory = itemToRenderer(column, renderer.data);
+        return factory !== elementToFactoryMap[renderer];
+    }
 
     /**
      *  @private

        
        const renderer:IGridItemRenderer = visibleItemRenderers[index];
        visibleItemRenderers[index] = null;
        return renderer;
    }
    

        if (!renderer)
            return;
        
        // If the renderer at rowIndex,columnIndex is going to have to be replaced, because
        // this columns itemRendererFunction now returns a different (IFactory) value, punt.
       
        if (itemRendererFunctionValueChanged(renderer))
        {
            renderer.grid.invalidateDisplayList();
            return;
        }
        
        initializeItemRenderer(renderer, rowIndex, columnIndex);
        
        // We're using layoutBoundsX,Y,Width,Height instead of x,y,width,height because
