2010-03-30 25 views
5

J'ai deux ComboBox associées (continents et pays). Lorsque les changements ComboBox continents je demande un XML à partir d'une certaine URL. Quand je reçois que XML je change le fournisseur de données pour la zone de liste déroulante de pays, comme ceci:Flex 3.5.0; Mise à jour de la liste d'affichage de ComboBox lors de la modification de dataprovider

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

J'envoie la ListEvent.CHANGE parce que je l'utilise pour changer une autre ComboBox donc s'il vous plaît ignorer (et la 1ère ligne). Donc, mon problème est le suivant: je sélectionne "ASIA" sur les premiers continents, puis les données de la combobox DATA sont mises à jour (je peux voir cela parce que le premier ITEM est un item avec le label '23 pays '). Je clique sur le combo puis je peux voir les pays.

Maintenant, je sélectionne "Afrique", le premier article est affiché, avec le ComboBox étant fermé, puis quand je clique dessus, les pays sont toujours ceux d'Asie. Quoi qu'il en soit, si je clique sur un élément dans la liste, alors la liste se met à jour correctement, et aussi, il a l'information correcte (comme je l'ai dit, cela affecte les autres ComboBox). Le seul problème est que la liste d'affichage n'est pas mise à jour.

Dans cette fonction, j'ai essayé ces approches

  • Converting XMLList à XMLCollection et même ArrayCollection

  • Ajout this.resellersCountry.invalidateDisplayList(); Déclencher des événements comme DATA_CHANGE et UPDATE_COMPLETE Je sais qu'ils n'ont pas beaucoup de sens, mais je suis un peu désespérée.

Veuillez noter que lorsque j'ai utilisé le SDK 3.0.0 cela ne s'est pas produit. Désolé si je suis stupide, mais les événements flex me détruisent.

Répondre

11

La définition du fournisseur de données de la liste déroulante de comboBox semble résoudre ce problème.

this.resellersCountry.dataProvider = items; 
this.resellersCountry.dropdown.dataProvider = items; 
+0

désolé, mais j'ai déjà changé l'interface graphique et je ne peux pas vérifier votre solution. Je vais essayer dès que j'en aurai l'occasion et accepter votre réponse. Merci encore. –

+0

vérifié. ça marche. –

+0

A travaillé pour moi aussi. – Konsumierer

1

this.resellersCountry.dropdown.dataProvider = articles;

œuvres (Flex SDK 3.5)

espère que ce bug dans 4.0

1

En plus de réponse Christophe's:

Lorsque vous utilisez la liaison de données dans votre ComboBox vous devez utiliser la BindingUtils pour régler le dataprovider dropdown's:

MXML:

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

Script:

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

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

Merci à Christophe pour pointer dans la bonne direction.

0

Une autre solution, décrite dans un Adobe Community forum post, est d'éviter la ré-assignation d'un autre objet ArrayCollection à la zone de liste déroulante, et au lieu de réutiliser (et re-peuplement) l'original à la place:

items.removeAll(); 
for each (var item:* in newItems) 
{ 
    items.addItem(item); 
}