2010-12-26 10 views
2

1つのDropDownListに対して2つのdataProviderがあります。次のコードをコンパイルして実行することができます。FlexSpark DropDownList selectedItemは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> 

シナリオ1:dataProviderは更新されましたが、selectedIndexは同じです。 起動時に:[listSelectedItem = Flex、listSelectedIndex = 1]。 Flip:dataProviderは更新されますが、[listSelectedItem = Flex、listSelectedIndex = 1]のままです。

シナリオ2:dataProviderが更新され、selectedIndexも更新されました。 起動時に:[listSelectedItem = Flex、listSelectedIndex = 1]。 リストから航空を選択:[listSelectedItem = Air、listSelectedIndex = 2]。 Flip:dataProviderは更新されますが、[listSelectedItem = Catalyst、listSelectedIndex = 1]のままです。

selectedItemはselectedIndexによって駆動されるようです。 selectedItemは、selectedIndexの更新時にのみ更新されます。 dataProviderが更新されたときにselectedItemを更新しないでください。 selectedItemへのバインディングに欠陥がありますか?

+0

壊れたものはLabelとlist.selectedItem。あなたのコードでこれを試してみると、selectedItemが正しく設定されていることがわかります。 ' –

答えて

2

おそらく、あなたはそれが壊れていると仮定しています。私はそれについて判断しません。あなたの問題の修正はかなり単純ですが、フリップ関数を変更して選択したインデックスをリセットすることで、リストのデータ変更をトリガーし、最終的にコンポーネントにバインドします:

public function flipLast():void { 
      list.selectedIndex = -1; 
      if(last) { 
       list.dataProvider = dp1; 
       list.selectedItem = "Flex"; 
      } else { 
       list.dataProvider = dp2; 
       list.selectedItem = "Catalyst";   
      } 
      last = !last; 
    } 
関連する問題