5

2つの関連するComboBox(大陸と国)があります。大陸のComboBoxが変更されると、特定のURLからXMLを要求します。そのXMLを受け取ったら、ComboBoxの国のDataProviderを次のように変更します。

public function displayCountryArray( items:XMLList ):void
        {
            this.resellersCountryLoader.alpha = 0;
            this.resellersCountry.dataProvider = items;
            this.resellersCountry.dispatchEvent( new ListEvent( ListEvent.CHANGE ) );
        }

ListEvent.CHANGEをディスパッチするのは、別のComboBoxを変更するために使用するためです。そのため、それ(および1行目)は無視してください。

したがって、私の問題はこれです。最初の大陸から「ASIA」を選択すると、コンボボックスのDATAが更新されます(最初のITEMは「23countries」というラベルのアイテムであるためわかります)。コンボをクリックすると、国が表示されます。

ここで、「アフリカ」を選択すると、最初の項目が表示され、ComboBoxが閉じられます。次に、それをクリックすると、国はまだアジアの国です。とにかく、リスト内のアイテムをクリックすると、リストは正しく更新され、また、正しい情報が含まれます(他のComboBoxに影響します)。したがって、唯一の問題は、表示リストが更新されないことです。

この関数では、これらのアプローチを試しました

  • XMLListをXMLCollection、さらにはArrayCollectionに変換する

  • this.resellersCountry.invalidateDisplayList();を追加します。

  • DATA_CHANGEやUPDATE_COMPLETEのようなイベントをトリガーすることはあまり意味がないことは知っていますが、私は少し必死になりました。

3.0.0 SDKを使用した場合、これは発生しなかったことに注意してください。

私が愚かなら申し訳ありませんが、フレックスイベントは私を殺しています。

4

4 に答える 4

11

コンボボックスのドロップダウンのデータプロバイダーを設定すると、この問題が解決するようです。

this.resellersCountry.dataProvider = items;
this.resellersCountry.dropdown.dataProvider = items;
于 2010-04-13T14:35:53.427 に答える
1

this.resellersCountry.dropdown.dataProvider = items;

動作します(Flex SDK 3.5)

このバグが4.0で修正されることを願っています

于 2010-05-06T15:21:31.307 に答える
1

クリストフの答えに加えて:

ComboBoxでデータバインディングを使用している場合は、BindingUtilsを使用してドロップダウンのデータプロバイダーを設定する必要があります。

MXML:

<mx:ComboBox id="cb_fontFamily"
        width="100%"
        dataProvider="{ model.fontFamilies }" />

脚本:

private function init():void
{
    BindingUtils.bindSetter(updateFontFamilies, model, "fontFamilies");
}

private function updateFontFamilies(fontFamilies:ArrayCollection):void
{
    if (cb_fontFamily != null) cb_fontFamily.dropdown.dataProvider = fontFamilies;
}

正しい方向を示してくれたクリストフに感謝します。

于 2011-04-14T15:28:52.540 に答える
0

Adobe Communityフォーラムの投稿で概説されている別の回避策は、ComboBoxに別のオブジェクトを再割り当てすることを避けArrayCollection、代わりに元のオブジェクトを再利用(および再入力)することです。

items.removeAll();
for each (var item:* in newItems)
{
    items.addItem(item);
}
于 2014-09-05T11:08:23.403 に答える