             dispatchEvent(new FlexEvent(FlexEvent.VALUE_COMMIT));
             
             //Dispatch the caretChange event 
-            e = new IndexChangeEvent(IndexChangeEvent.CARET_CHANGE); 
-            e.oldIndex = oldCaretIndex; 
-            e.newIndex = caretIndex; 
-            dispatchEvent(e);
-        }
+            if (changeCaretOnSelection)
+            {
+                e = new IndexChangeEvent(IndexChangeEvent.CARET_CHANGE); 
+                e.oldIndex = oldCaretIndex; 
+                e.newIndex = caretIndex; 
+                dispatchEvent(e);
+            }
+        }
+        
+        // default changeCaretOnSelection back to true
+        changeCaretOnSelection = true;
         
         return true;
      }

    mx_internal function dataProviderRefreshed():void
    {
        setSelectedIndex(NO_SELECTION, false);
        setCurrentCaretIndex(NO_CARET);
    }
    

     * 
     *  @param dispatchChangeEvent if true, the component will dispatch a "change" event if the
     *  value has changed. Otherwise, it will dispatch a "valueCommit" event. 
     * 
     *  @param changeCaret if true, the caret will be set to the selectedIndex as a side-effect of calling 
     *  this method.  If false, caretIndex won't change.
     */
    mx_internal function setSelectedIndex(value:int, dispatchChangeEvent:Boolean = false, changeCaret:Boolean = true):void
    {
        if (value == selectedIndex)
        {
            // this should short-circuit, but we should check to make sure 
            // that caret doesn't need to be changed either, as that's a side
            // effect of setting selectedIndex
            if (changeCaret)
                setCurrentCaretIndex(selectedIndex);
            
            return;
        }
        
        if (dispatchChangeEvent)
            dispatchChangeAfterSelection = (dispatchChangeAfterSelection || dispatchChangeEvent);
        changeCaretOnSelection = changeCaret;
        _proposedSelectedIndex = value;
        invalidateProperties();
    }
