      *  @playerversion AIR 1.1
      *  @productversion Flex 3
      */
-    public var dataField:String;
+     public function get dataField():String
+     {
+          return _dataField;
+     }
+
+     /**
+      *  @private
+      */
+     public function set dataField(value:String):void
+     {
+        _dataField = value;
+  
+        if ( value.indexOf( "." ) != -1 ) 
+        {
+            hasComplexFieldName = true;
+            complexFieldNameComponents = value.split( "." );
+            
+            if ( _sortCompareFunction == null ) 
+            {
+                //if the sort field is null, but the user supplied a complex dataField, we will assign a generic
+                //sort compare that handles this situation. It will yield identical results to the sort created in
+                //datagrid under normal circumstances
+                
+                //intentionally not using the setter, the user might still override this or be looking for that change
+                //we want to this to be purely happen behind the scenes if there is no function provided
+                _sortCompareFunction = complexColumnSortCompare;
+            }
+            
+        }
+
+        if (owner)
+            owner.invalidateList();
+     }
 
     //----------------------------------
     //  dataTipField

import flash.display.DisplayObject;
import flash.events.Event;
import flash.utils.Dictionary;
import mx.controls.DataGrid;
import mx.controls.TextInput;
import mx.controls.listClasses.IListItemRenderer;
import mx.core.ClassFactory;
import mx.core.EmbeddedFont;
import mx.core.EmbeddedFontRegistry;
import mx.core.IEmbeddedFontRegistry;
import mx.core.IFactory;
import mx.core.IFlexModuleFactory;
import mx.core.IIMESupport;
import mx.core.mx_internal;
import mx.core.Singleton;
import mx.styles.CSSStyleDeclaration;
import mx.styles.StyleManager;
import mx.utils.StringUtil;
import mx.core.ContextualClassFactory;

use namespace mx_internal;


        return " ";
    }

    protected function deriveComplexColumnData( data:Object ):Object 
    {
        var currentRef:Object = data;
        if ( complexFieldNameComponents ) 
        {
            for ( var i:int=0; i<complexFieldNameComponents.length; i++ )
                currentRef = currentRef[ complexFieldNameComponents[ i ] ];
        }
        
        return currentRef;
    }

    protected function complexColumnSortCompare( obj1:Object, obj2:Object ):int 
    {
        if ( !obj1 && !obj2 )
            return 0;
        
        if ( !obj1 )
            return 1;
        
        if ( !obj2 )
            return -1;
        
        var obj1Data:String = deriveComplexColumnData( obj1 ).toString();
        var obj2Data:String = deriveComplexColumnData( obj2 ).toString();
        
        if ( obj1Data < obj2Data )
            return -1;
        
        if ( obj1Data > obj2Data )
            return 1;
        
        return 0;
    }

    /**
     *  Return the appropriate factory, using the default factory if none specified.
     *
