Avg. Rating 3.7

Problem

Needed ComboBox extension with access to old and new selectedItem values on it changed (by user activity or on dataProvider collection changed)

Solution

Create custom event with Object instance holding both values and override ComboBox seletedItem and selectedIndex setters to save values and event dispatch on changed.

Detailed explanation

In this recipe, inspire of Simple ComboBox extension old-new selected index pair holds post we need to process dataChanged event to - for example we have dataProvider binded to some service event or smth. The only improve we need to do is to add selectedItem setter overriding onto our costom class and make small corresponding sintax changes in selectedIndex setter. So, requested ComboBox extension looks like

package ru.codeflex.classes
{
import mx.controls.ComboBox;

import ru.codeflex.events.CodeFlexComboBoxEvent;

[Event(name="valueChanged", type="ru.codeflex.events.CodeFlexComboBoxEvent")]
public class CodeFlexComboBox extends ComboBox
{
private var oldSelectedItem:Object = {index: -1, item: null};

private var proxyItem:Object = null;
private var proxyIndex:Number = -1;

override public function set selectedIndex(value:int):void{

if(value != oldSelectedItem.index) {

proxyIndex = value;

if((proxyIndex != oldSelectedItem.index)&&(proxyItem != oldSelectedItem.item)){

dispatchEvent(new CodeFlexComboBoxEvent(CodeFlexComboBoxEvent.CODEFLEX_COMBOBOX_EVENT_FIRES, {oldValue: oldSelectedItem, newValue: {index: proxyIndex, item: proxyItem}}));
oldSelectedItem.index = proxyIndex;

}


}

super.selectedIndex = value;

}

override public function set selectedItem(value:Object):void{

if(value != oldSelectedItem.item) {

proxyItem = value;

if((proxyIndex != oldSelectedItem.index)&&(proxyItem != oldSelectedItem.item)){

dispatchEvent(new CodeFlexComboBoxEvent(CodeFlexComboBoxEvent.CODEFLEX_COMBOBOX_EVENT_FIRES, {oldValue: oldSelectedItem, newValue: {index: proxyIndex, item: proxyItem}}));
oldSelectedItem.item = proxyItem;

}


}

super.selectedItem = value;

}
}
}

Custom event without any changes

package ru.codeflex.events {     import flash.events.Event;      public class CodeFlexComboBoxEvent extends Event     {                 public var obj:Object;//Object to cover data in; [oldValue:Object, newValue:Object]
        static public const CODEFLEX_COMBOBOX_EVENT_FIRES:String = "valueChanged";
   
        public function CodeFlexComboBoxEvent(type:String, obj:Object)
        {
            super(type);
            this.obj = obj;
        }
       
        override public function clone():Event
        {
            return new CodeFlexComboBoxEvent(type, obj);
        }
       
       
    }
}

And small change in application custom event handler to show old and new selected items labels

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:classes="ru.codeflex.classes.*">
<mx:Script>
    <![CDATA[
        import mx.collections.ArrayCollection;
        import ru.codeflex.events.CodeFlexComboBoxEvent;
       
        [Bindable]
         public var list:ArrayCollection = new ArrayCollection([
        { label: "first"},
        { label: "second"},
        { label: "third"},
        { label: "fourth"}
        ]);
       
       
        private function valueChangedHandler(evt:CodeFlexComboBoxEvent):void{
       
            trace('label was '+ evt.obj.oldValue.item.label+" , now " + evt.obj.newValue.item.label);
        }
    ]]>
</mx:Script>   

<classes:CodeFlexComboBox id="cfcb" dataProvider="{list}" selectedIndex="0" valueChanged="{valueChangedHandler(event)}" />   

</mx:Application>

 

Report abuse

Related recipes