2010-06-09 9 views
4

J'ai un projet qui a été compilé avec le SDK Flex 3.2. Un de mes composants est un combobox, qui est lié à une propriété (appelée produits) dans le modèle Cairngorm. Si j'insère une nouvelle valeur dans model.products, la liste déroulante affiche immédiatement la nouvelle valeur. Fonctionne parfaitement. J'ai ensuite déplacé vers le SDK 3.5, et l'exécution de l'opération identique provoque un problème. Même si le modèle a été mis à jour (j'ai vérifié que c'est vraiment le cas), la combobox n'affiche pas la nouvelle valeur correctement - il semble savoir qu'il y a un nouvel item parce qu'il y a une nouvelle ligne dans le combo, mais la nouvelle ligne est vide et non sélectionnable. Les éléments existants dans le combo sont là et sélectionnables (comme ils devraient l'être). Si je réinitialise le formulaire (c'est-à-dire ferme et rouvre la TitleWindow sur laquelle se trouve le combo), toutes les valeurs correctes (y compris la nouvelle) sont affichées dans le combo.Adobe Flex Combobox DataProvider

J'ai fait un va-et-vient plusieurs fois entre 3.2 et 3.5 pour vérifier que c'est effectivement la cause.

Toute idée sur la façon de contourner ce problème serait grandement appréciée.

Répondre

6

Changez-vous le dataProvider ou le remplacez-vous?

J'ai remarqué que dans la version Flex 4 du module AutoCompleteComboBox de Flextras, le DataProvider de ComboBox n'est parfois pas synchronisé avec le DataProvider du menu déroulant. Je pensais que tout cela était de ma faute en raison des changements que j'ai apportés pour ajouter AutoComplete à la ComboBox.

Il est tout à fait possible que cette modification ait été ajoutée dans Flex 3.5; et je ne l'ai pas remarqué avant mes aventures Flex 4.

D'abord, j'essaierais d'invalider le ComboBox quand le dataProvider change. Vous pouvez le faire en écoutant l'événement collectionChange de la collection. Dans le gestionnaire d'événements faites juste:

myCombo.invalidateProperties() 
myCombo.invalidateDisplayList() 

Si vous repacing le dataprovider, alors vous pouvez essayer de remplacer la méthode dataProvider de jeu et ajouter une ligne comme celui-ci:

this.dropdown.dataProvider = value; 

Est-ce un problème étrange . Je crois en Flex 3/3.2 que chaque fois que le dataProvider a changé, le menu déroulant a été fermé [détruit] et recréé. Il semble qu'ils ont arrêté de le faire à un moment donné; ce qui provoque cette anomalie.

+0

Le fournisseur de données pour le combo a été défini sur un modèle lisible (Cairngorm). Ainsi, la mise à jour du modèle dans le résultat de la commande a automatiquement passé à la combobox. Eh bien, il l'habitude de toute façon. Après avoir testé un peu plus, il semble que je dois réinitialiser le fournisseur de données: cb_products.dataProvider = model.products; Qui craint un peu. – JonoB

+0

En fait, ce qui précède ne fonctionne pas. Il semble que cb_products.dropdown.dataProvider = model.products fait cependant. Ce qui suce encore. – JonoB

+0

Vous remplacez le fournisseur de données par ce code. Il doit y avoir un bug de frange ajouté à la ComboBox quelque part entre 3.2 et 3.5. Vous pouvez probablement étendre la zone de liste déroulante et remplacer la méthode set dataProvider pour effectuer cette mise à jour en interne afin que vous n'ayez pas à le faire manuellement. – JeffryHouser

5
//this will replace the list base on an update 
private var newDropDown:ListBase; 

//This addresses a bug in flex 3.5 SDK 
//where the list base does reflect changes to the data provider 
//forums.adobe.com/thread/597632 
//bugs.adobe.com/jira/browse/SDK-25705 
//bugs.adobe.com/jira/browse/SDK-25567 
override public function set dataProvider(value:Object):void 
{ 
    super.dataProvider = value; 
    newDropDown = dropdown; 

    if(newDropDown) 
    { 
     validateSize(true); 
     newDropDown.dataProvider = super.dataProvider; 
    } 
}