2010-08-02 1 views
0

J'ai le code suivant.dans Flex DropDownList, existe-t-il un moyen de lier à une propriété d'un élément dans dataProvider?

<s:DropDownList dataProvider={_dataProvider}/> 
<fx:Script> 
    private var _dataProvider:ArrayCollection = new ArrayCollection([{label:"one", data:1}, {label:"two", data:2}]); 
</fx:Script> 

Je souhaite lier la propriété data de l'élément selected dans DropDownList. Y a-t-il un moyen de faire cela?

+0

Bind à quoi, exactement? Ce que je pense que vous décrivez est mieux géré en ajoutant un écouteur à l'événement de modification de DropDownList. – Robusto

Répondre

1

Je suis assez sûr que la réponse est non, mais juste pour être clair; Je suis confus.

Si votre fournisseur de données contient des objets comme celui-ci:

{label:"one", data:1} 

Tout d'abord, cette syntaxe va créer un objet générique sans personnalisation. Si aucune des propriétés de cet objet n'est explicitement définie, aucune d'entre elles ne peut implémenter la balise de métadonnées Bindable. Par conséquent, lorsqu'elle est utilisée comme source pour la liaison de données, la cible ne sera jamais mise à jour. En second lieu, même si vous avez créé votre propre objet non générique avec des propriétés pouvant être liées, la liaison ne va généralement pas à plusieurs niveaux dans les propriétés d'un tableau.

L'élément selected pointera sur un objet comme dans votre _dataProvider, ou éventuellement null, en fonction de l'interaction de l'utilisateur avec dropDownList. La liaison de l'élément selectedItem à une propriété à l'intérieur de l'élément n'a pas de sens; parce que vous seriez en train de comparer un littéral à un objet et que rien ne serait jamais sélectionné.

Je ne suis pas clair, sans regarder, ce qui se passe dans le DropDownList lorsque vous essayez de définir selectedItem à un élément qui ne se trouve pas dans votre dataProvider. J'imagine que cela réinitialise la sélection, cependant.

Si vous pouvez développer ce que vous essayez d'accomplir exactement, nous pouvons être en mesure d'aider davantage.

+0

Ok, j'aurais dû être plus clair. Je voulais que les données se lient à une propriété dans le modèle de présentation. mais j'étais juste stupide .. J'aurais dû avoir le dataProvider dans le modèle de présentation pour commencer .. Maintenant, j'ai des propriétés définies dans le modèle de présentation qui gère l'extraction de données. – lordofthefobs

+0

Alors, vous êtes prêt? Ou pas? – JeffryHouser

+0

Cela n'est pas vraiment vrai: "Si aucune des propriétés de cet objet n'est explicitement définie, aucune d'entre elles ne peut implémenter la balise de métadonnées Bindable, et par conséquent aucune d'elles ne peut être utilisée comme source de liaison de données". Vous pouvez toujours les utiliser comme source, ils ne seront simplement pas mis à jour si la propriété elle-même change. C'est bien dans cette situation puisque le contenu de l'élément sélectionné n'est pas aussi important que l'élément lui-même a été sélectionné. –

1
<s:DropDownList id="ddl" dataProvider="{_dataProvider}"/> 
<s:Label text="{ddl.selectedItem.data.toString()}"/> 
+0

Vous avez donc une liste déroulante de [objet] et vous devez regarder une étiquette pour voir le nom d'affichage voulu? Terrible. –

0

Oui. Tu peux le faire. C'est assez simple, en fait. Je le fais tout le temps:

<s:DropDownList dataProvider="{_dataProvider}" selectedItem="@{_selectedItem}" /> 

Avec ActionScript qui ressemble à ceci:

private var _dataProvider:ArrayCollection = new ArrayCollection([{label:"one", data:1}, {label:"two", data:2}]); 
[Bindable] private var _selectedItem; 

Chaque fois que l'utilisateur sélectionne un élément dans la liste déroulante, le _selectedItem soit défini.

2

Je ne sais pas si c'est une autre approche de la question ... mais j'ai créé une liste déroulante personnalisée et j'ai lié l'élément selected aux changements entrants. Lorsque la valeur de mes données souhaitées change, cela déclenchera la liste déroulante pour changer sa sélection.

DropDownListBindable.mxml

<?xml version="1.0" encoding="utf-8"?> 
<s:DropDownList xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:mx="library://ns.adobe.com/flex/mx"> 
    <fx:Script> 
     <![CDATA[ 
      import mx.controls.Alert; 
      [Bindable] public var valueField:String = ""; 

      override public function set selectedItem(value:*):void{ 
       try{ 
        for(var i:uint=0;i<this.dataProvider.length;i++){ 
         if(this.dataProvider[i][this.valueField]==value){ 
          this.selectedIndex=i; 
          break;      
         }else{ 
          this.selectedIndex=-1; 
         } 
        } 
       }catch(e:Error){} 
      } 
     ]]> 
    </fx:Script> 
</s:DropDownList> 

Sur demande j'importer le dropdownlist personnalisé et lier les ValueField avec tout ce qui doit être binded ... dans votre cas son « données ». J'ai également créé un objet appelé 'mydata' pour que la liste déroulante écoute les changements. Quand mydata change, la liste le sera aussi. J'ai ajouté un bouton pour montrer comment la liste change.

main.mxml

<?xml version="1.0" encoding="utf-8"?> 
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:mx="library://ns.adobe.com/flex/mx" 
    xmlns:components="com.components.*"> 
    <fx:Script> 
     <![CDATA[ 
      import mx.collections.ArrayCollection;   
      [Bindable] private var myData:Object = new Object(); 
      [Bindable] private var _dataProvider:ArrayCollection = new ArrayCollection([{label:"one", data:1}, {label:"two", data:2}]); 

     ]]> 
    </fx:Script> 
    <s:HGroup> 
     <components:DropDownListBindable 
      dataProvider="{_dataProvider}" 
      prompt="--select one--"  
      selectedItem="{this.myData}" 
      id="ddl"     
      valueField="data"     
      labelField="label"/> 
     <s:Button label="change datafield" click="this.myData=1"/> 
    </s:HGroup> 
</s:Application>