Re: Combo box changes selected Item when dp refreshes
This code should help. As soon as the app launches, select value3. If the new
array has gthe previously selected item, it will still be selected, otherwise
it will of course revert to the first item.
----- components/dp1.as -----
package components
{
import flash.events.TimerEvent;
import flash.utils.Timer;
import mx.collections.ArrayCollection;
import mx.controls.Alert;
public class dp1{
[Bindable] public var arr1:ArrayCollection = new ArrayCollection([
"value1", "value2", "value3"
]);
public var arr2:ArrayCollection = new ArrayCollection([
"value1", "value2", "value3", "value4", "value5", "value6"
]);
public var arr3:ArrayCollection = new ArrayCollection([
"value1", "value2"
]);
private var timer:Timer = new Timer(10000, 0);
private var cnt:uint = 1;
public function dp1(){
timer.addEventListener(TimerEvent.TIMER, timerHandler);
timer.start();
}
public function timerHandler(event:TimerEvent):void{
if(cnt++ % 3 == 0){
mx.controls.Alert.show("Switched to arr3, should NOT see value3.");
arr1 = arr3;
}else if(cnt++ % 2 == 0){
mx.controls.Alert.show("Switched to arr2, SHOULD see value3.");
arr1 = arr2;
}
arr1.refresh();
}
}
}
----------------------------------------------------------
----- ComboBoxController.mxml -----
<?xml version="1.0"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
creationComplete="init()">
<mx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.collections.ArrayCollection;
import mx.events.CollectionEvent;
import components.dp1;
import mx.events.PropertyChangeEvent;
import mx.binding.utils.ChangeWatcher;
[Bindable] public var dp1:components.dp1 = new components.dp1();
[Bindable] private var cbxSelected:Object;
private var activityWatcher:ChangeWatcher;
private function init():void{
if(ChangeWatcher.canWatch(cbx, "dataProvider")){
activityWatcher = ChangeWatcher.watch( cbx, "dataProvider",
cbxDataProviderChangeHandler);
}
}
private function cbxDataProviderChangeHandler( event:CollectionEvent
):void{
var newDP:ArrayCollection = event.currentTarget.dataProvider as
ArrayCollection;
if(newDP.contains(cbxSelected)){
cbx.selectedIndex =
cbx.dataProvider.getItemIndex(cbxSelected.toString ());
}
}
]]>
</mx:Script>
<mx:ComboBox id="cbx" dataProvider="{dp1.arr1}"
change="cbxSelected=cbx.selectedItem"/>
</mx:Application>
|