Flex Spark DropdownList SelectedItemは、DataProviderが変更された後に更新されませんでした

StackOverflow https://stackoverflow.com/questions/4535119

質問

1つのドロップダウンリスト用の2つの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、listelectedIndex = 1]。 [Flip]をクリックします:DataProviderが更新されますが、[ListSelectedItem = Flex、ListSelectedIndex = 1]。

シナリオ2:DataProviderが更新され、SelectedIndexも更新されます。起動時:[listSelectedItem = flex、listelectedIndex = 1]。リストからAirを選択します:[listelectedItem = air、listelectedindex = 2]。 [Flip]をクリックします:DataProviderが更新されますが、[ListElectedItem = Catalyst、ListElectedIndex = 1]。

SelectedItemはSelectedIndexによって駆動されるように思えます。 SelectedItemの更新は、selectedindexの更新の場合にのみ更新されます。 DataProviderが更新された場合、SelectedItemを更新する必要はありませんか? SelectedItemへのバインディングには欠陥がありますか?

役に立ちましたか?

解決

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

public function flipLast():void {
          list.selectedIndex = -1;
          if( last ) {
               list.dataProvider = dp1;
               list.selectedItem = "Flex";
          } else {
               list.dataProvider = dp2;
               list.selectedItem = "Catalyst";        
          }
          last = !last;
     }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top