         if (labelDisplay)
             removeChild(DisplayObject(labelDisplay));
         
-        labelDisplay = IUITextField(createInFontContext(UITextField)); 
-        labelDisplay.multiline = true;
+        labelDisplay = IUITextField(createInFontContext(UITextField));
+        labelDisplay.multiline = true;  // consistent with singleLine=false (the default)
         labelDisplay.wordWrap = true;
-        labelDisplay.autoSize = TextFieldAutoSize.LEFT;
+        labelDisplay.autoSize = TextFieldAutoSize.NONE;
+        
+        // The default width of a TextField is 100.  If autoWrap is true, and
+        // multiline is true, the measured text will wrap if it is wider than
+        // the TextField's width. This is not what we want when measuring the 
+        // width of typicalItem columns that lack an explicit GridColumn width.
+        
+        labelDisplay.setActualSize(4096, NaN);  // 4096 is just an arbitrarily large value
         
         addChild(DisplayObject(labelDisplay));
-        if (_label != "")
-            labelDisplay.text = _label;
-    }
-    
-    /**
-     *  @private
-     */
-    override protected function createChildren():void
-    {
-        super.createChildren();
-        createLabelDisplay();
     }
     
     /**

    /**
     *  @private
     *  Watch Out: this code relies on the fact that UITextField/setActualSize() can cause
     *  labelDisplay.textHeight to change, if the text wraps.  The text field's measuredHeight
     *  is just a padded version of textHeight.  This is the only place where labelDisplay.setActualSize() 
     *  is called, so we update the measuredHeight of this render here.  Very unconventional.
     *  Doing so is essential because after this code runs, i.e. after GridLayout/layoutGridElement()
     *  invokes validateNow() on this renderer, it uses the renderer's preferredBoundsHeight()
     *  (that's the measuredHeight in our case) to update the overall row height.
     */
    override protected function updateDisplayList(width:Number, height:Number):void
    {
        super.updateDisplayList(width, height);

        labelDisplay.setActualSize(width - 10, height - 5);  // setActualSize() side-effects labelDisplay.textHeight
        updateMeasuredSize();  // See @private comment above 
        
        // If the Grid's row heights are fixed and the labelDisplay will not fit, then clip.
        
        const grid:Grid = column.grid; 
        if (grid && !grid.variableRowHeight && (measuredHeight > grid.rowHeight))
        {
            clippingEnabled = true;
            labelDisplay.scrollRect = new Rectangle(0, 0, width - 10, height - 5);
        }
        else if (clippingEnabled)
        {
            clippingEnabled = false;
            labelDisplay.scrollRect = null;
        }
        
        labelDisplay.move(5, 5);
    }
 
        

        if (_dragging == value)
            return;
        
        _dragging = value;
        dispatchChangeEvent("draggingChanged");        
    }
