Comment ajuster la largeur de Flex 3 ComboBox en fonction du contenu lié de dataProvider modifié?
-
07-07-2019 - |
Question
Dans Flex 3, j'ai créé un composant ComboBox dans un composant MXML semblable au suivant:
<mx:ComboBox id="comboBox" dataProvider="{_choices}" />
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
// etc...
public function get choices():ArrayCollection { return _choices; }
[Bindable]
private var _choices:ArrayCollection =
new ArrayCollection( [ { data: "ALL", label: "All" } ] );
// etc...
]]>
</mx:Script>
</mx:HBox>
Dans l'application MXML parente, je modifie le contenu de la propriété choices:
myComponentId.choices.removeAll();
myComponentId.choices.addItem({data: "NY", label: "New York"});
myComponentId.choices.addItem({data: "CA", label: "California"});
// etc...
La liaison fonctionne en ce sens que la zone de liste déroulante capte automatiquement les nouveaux contenus ajoutés au moment de l'exécution, cependant , elle ne modifie pas sa largeur. La largeur initiale de la ComboBox est suffisamment large pour afficher uniquement l'élément initial "Tous". déclaré dans le composant. Cependant, je souhaite et je m'attendais à ce que la ComboBox se redimensionne automatiquement pendant la liaison pour pouvoir afficher "Californie", mais ce n'est pas le cas.
Comment puis-je obliger la ComboBox à mettre à jour sa largeur après avoir ajouté de nouvelles étiquettes plus larges à son fournisseur de données? Merci!
La solution
Il vous suffit probablement d'appeler invalidateProperties ()
, invalidateDisplayList ()
, invalidateSize ()
ou une combinaison des trois (I suis un peu novice moi-même), pour forcer une mise à jour des mesures du composant après avoir changé le fournisseur de données ou son contenu.
myComponentId.invalidateSize();
myComponentId.invalidateDisplayList();
myComponentId.invalidateProperties();
Autres conseils
Je voudrais ajouter un paramètre pour choice
et appeler validateNow ()
sur la zone de liste déroulante à la fin du programme de configuration:
public function set choices(value:ArrayCollection):void
{
_choices = value;
comboBox.validateNow();
}
J'ai rencontré le même problème et aucun de ceux-ci n'a fonctionné pour moi. J'ai réussi à résoudre ce problème en créant un nouveau gestionnaire d'événements
menuComboBox.addEventListener(ResizeEvent.RESIZE, updateListWidth);
La méthode appelée dans cet événement redimensionne simplement la propriété dropdown.width.
private function updateListWidth(event:ResizeEvent):void {
menuComboBox.dropdown.width = menuComboBox.width;
}