2010-01-23 4 views
1

bien, j'ai un combobox que je lie sa propriété selectedItem à un objet d'objets de valeur, comme celui-cidatabinding flex avec la propriété selectedItem du problème de mise à jour combobox plusieurs fois

<fx:Binding source="styles_cb.selectedItem.toString()" destination="_uniform.style"/> 
<fx:Declarations> 
<fx:XML id="config_xml" xmlns="" source="config.xml" /> 
<!-- Place non-visual elements (e.g., services, value objects) here --> 
</fx:Declarations> 

<mx:ComboBox x="66.15" y="63.85" editable="false" id="styles_cb" dataProvider="{config_xml.styles.style}" /> 

l'objet de valeur est une classe personnalisée avec des setters et getters, et je veux définir une propriété en fonction de la valeur de la selectedItem du combo, donc dans l'objet de valeur que j'ai quelque chose comme ça

[Bindable] 
public function set style(value:String):void 
{ 
_style = value; 
trace(value); 
} 

mon problème est que chaque fois que je change la sélection combobox qui en fait changer le style propre ty de l'objet de valeur il le fait 3 fois, si je trace la valeur du setter il fait réellement la trace 3 fois, pourquoi ?? Comment puis-je éviter ça? Je fais quelque chose de mal? ou il existe une meilleure façon de le faire, s'il vous plaît aider, merci pour toute aide

Répondre

1

wow !!, parfois écrire une question vous laisse y réfléchir deux fois et vous laisser trouver la réponse par vous-même, donc je trouve ma propre solution, dans la documentation dit je peux rendre toutes les propriétés d'un objet Je mets [Bindable] dans la déclaration de classe, donc je l'ai fait comme ça

[Bindable] 
[RemoteClass(alias='Uniform')] 
public class Uniform extends Object implements IEventDispatcher 

mais quand je tentais de distribuer un événement dans les setters que je trouve dans les documents que je dois ajouter le nom de l'événement comme celui-ci

[Bindable("styleChanged")] 
public function get style():String 
{ 
    return _style; 
} 

public function set style(value:String):void 
{ 
_style = value; 
dispatchEvent(new Event("styleChanged")); 
} 

maintenant je trouve que faire cela, marquer le p roperty avec une double liaison et qui m'a fait définir la propriété plusieurs fois, hugg !, mais maintenant je sais que je peux éviter d'utiliser la seconde [Bindable] et toujours l'événement obtenir dispatch, alors maintenant je me demande pourquoi je dois utiliser [Bindable (« styleChanged »)] en premier lieu si je peux encore dispacth l'événement avec seulement [Bindable] et la méthode d'expédition ?, bizarre

espoir cette aide à quelqu'un

+1

Ceci est une deuxième question dans une réponse à votre propre question?!? [Bindable] sans nom entraînera le compilateur à envelopper automatiquement le setter dans une autre méthode qui distribue un événement "propertyChanged" et l'objet événement a des informations sur la propriété qui a changé. [Bindable ("somethingChanged")] ne change pas du tout le code et indique que vous allez envoyer cet événement vous-même. La deuxième forme est préférée car l'événement est unique à la propriété. Je pourrais expliquer plus si c'était une vraie question .. mais question dans une réponse .. les commentaires sont limités .. –

+0

ouais désolé à ce sujet, cependant est vrai ce que vous avez dit et fonctionne grand pour moi merci! – goseta

1

Il est commun pour les expressions de liaison de données à tirer plusieurs fois plus que ce que l'on pourrait attendre. Je ne connais pas la raison exacte. Si cela pose problème pour votre application, ne liez pas directement la source à la cible, utilisez plutôt l'invalidation. Liez la source pour définir un indicateur, stylesSelectedItemChanged et appelez invalidateProperties(). Puis remplacez commitProperties() et dans votre commitProperties(), vérifiez si stylesSelectedItemChanged est vrai, et si c'est le cas, propagez la nouvelle valeur à la destination et réinitialisez l'indicateur à false. Assurez-vous d'appeler aussi super.commitProperties() sinon beaucoup de choses vont se casser.

L'invalidation est extrêmement courante dans le framework Flex, chaque composant l'utilise en interne, et cela aide beaucoup avec ce genre de problèmes.

+0

bien que je trouve la réponse de mon problème, cependant vous approchez est très intéressant et pour sûr je peux l'utiliser dans autre situation, vous répondez indirectement répondre à une autre question que j'ai eue, merci beaucoup :) – goseta

Questions connexes