      */
     public function set selectedIndex(value:int):void
     {
+        setSelectedIndex(value, false);
+    }
+    
+    /**
+     *  @private
+     *  Used internally to specify whether the selectedIndex changed programmatically or due to 
+     *  user interaction. 
+     * 
+     *  @param dispatchChangeEvent if true, the component will dispatch a "change" event if the
+     *  value has changed. Otherwise, it will dispatch a "valueCommit" event. 
+     */
+    mx_internal function setSelectedIndex(value:int, dispatchChangeEvent:Boolean = false):void
+    {
         if (value == selectedIndex)
             return;
-            
+        
+        if (dispatchChangeEvent)
+            dispatchChangeAfterSelection = dispatchChangeEvent;
         _proposedSelectedIndex = value;
         invalidateProperties();
     }

        }
        
        // Step 2: dispatch the "changing" event. If preventDefault() is called
        // on this event, the selection change will be cancelled.
        var e:IndexChangeEvent = new IndexChangeEvent(IndexChangeEvent.CHANGING, false, true);
        e.oldIndex = _selectedIndex;
        e.newIndex = _proposedSelectedIndex;
        if (!dispatchEvent(e))
        {
            // The event was cancelled. Cancel the selection change and return.
            _proposedSelectedIndex = NO_PROPOSED_SELECTION;
            return false;
        }
        
        // Step 3: commit the selection change and caret change

            selectedIndexAdjusted = false;
            if (!changedSelection)
            {
                dispatchEvent(new FlexEvent(FlexEvent.VALUE_COMMIT));
            }
        }
        
