对于一个 DropDownList,我有两个 dataProvider。下面的代码可以编译运行。
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
creationComplete="flipLast()"
minWidth="955" minHeight="600">
<fx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
public function flipLast():void {
if( last ) {
list.dataProvider = dp1;
list.selectedItem = "Flex";
} else {
list.dataProvider = dp2;
list.selectedItem = "Catalyst";
}
last = !last;
}
public var last:Boolean = true;
public var dp1:ArrayCollection = new ArrayCollection( [ "Flex", "Air" ] );
public var dp2:ArrayCollection = new ArrayCollection( [ "Catalyst", "FlashBuilder" ] );
]]>
</fx:Script>
<s:VGroup>
<s:DropDownList id="list" requireSelection="true" />
<s:Label id="listSelectedItem" text="{list.selectedItem}" />
<s:Label id="listSelectedIndex" text="{list.selectedIndex}" />
<s:Button label="Flip" click="flipLast()" />
</s:VGroup>
</s:Application>
场景一:dataProvider 更新了,但是 selectedIndex 是一样的。启动时:[ listSelectedItem=Flex, listSelectedIndex=1 ]。单击翻转:dataProvider 已更新,但仍为 [ listSelectedItem=Flex, listSelectedIndex=1 ]。
场景二:dataProvider 更新,selectedIndex 也更新。启动时:[ listSelectedItem=Flex, listSelectedIndex=1 ]。从列表中选择 Air:[ listSelectedItem=Air, listSelectedIndex=2 ]。单击翻转:dataProvider 已更新,但仍为 [ listSelectedItem=Catalyst, listSelectedIndex=1 ]。
在我看来,selectedItem 是由 selectedIndex 驱动的。selectedItem 仅在 selectedIndex 更新时更新。更新 dataProvider 时不应该更新 selectedItem 吗?绑定到 selectedItem 有缺陷吗?