             const columns:IList = columns;
             return (columns) ? columns.length : 0;
         }
+        
+        /**
+         *  @private
+         */
+        private function generateColumns():IList
+        {
+            var item:Object = typicalItem;
+            if (!item && dataProvider && (dataProvider.length > 0))
+                item = dataProvider[0];
+            
+            var itemColumns:IList = null;
+            if (item)
+            {
+                itemColumns = new ArrayList();
+                for (var property:String in item)
+                {
+                    var column:GridColumn = new GridColumn();
+                    column.dataField = property;
+                    itemColumns.addItem(column);
+                } 
+            }
+            
+            return itemColumns;
+        }
+       
         
         //----------------------------------
         //  dataProvider

    import flash.geom.Point;
    import flash.geom.Rectangle;
    
    import mx.collections.IList;
    import mx.core.IFactory;
    import mx.core.IVisualElement;

            if (_columns == value)
                return;
            
            generatedColumns = false;
            setColumns(value);
        }
        
        private function setColumns(value:IList):void
        {
            // Remove the old column listener, and set each column's grid=null, columnIndex=-1.
            
            const oldColumns:IList = _columns;
            if (oldColumns)
            {
                oldColumns.removeEventListener(CollectionEvent.COLLECTION_CHANGE, columns_collectionChangeHandler);
