     
     /**
      *  @private
+     *  If an element is invalid, then we listen for changes to the errorString
+     */
+    private function errorStringChangedHandler(event:Event):void
+    {
+        var uicElt:UIComponent = event.target as UIComponent;
+
+        // If errorString == "", then remove the target from the invalidElement dictionary
+        if (uicElt && uicElt.errorString == "")
+        {
+            var elementIndex:int = findInvalidElementIndex(uicElt);
+            if (elementIndex != -1)
+                _invalidElements.splice(elementIndex, 1);
+            
+            uicElt.removeEventListener("errorStringChanged", errorStringChangedHandler);
+            
+            errorStateChanged = true;
+            invalidateSkinState();
+        }
+    }
+    
+    /**
+     *  @private
      *  If one of our descendants has just passed validation, then
      *  remove it from the invalidElements dictionary
      */

        super();
        addEventListener(FlexEvent.VALID, validHandler, true);
        addEventListener(FlexEvent.INVALID, invalidHandler, true);
        // Set these here instead of in the CSS type selector for Form
        // We want to hide the fact that the Form itself doesn't show
        // the error skin or error tip, but that its children do. 

     *  @playerversion AIR 1.5
     *  @productversion Flex 4.5
     */
    public function get invalidElements():Array
    {
        return _invalidElements;
    }
