2010-09-09 7 views
0

Je rencontre des problèmes avec ma liaison de données et j'espère que quelqu'un pourra m'aider.Liaison Flex ComboBox aux enfants XML

J'ai créé un exemple très simple pour ce que j'essaie d'obtenir, que vous pouvez voir ci-dessous.

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" horizontalAlign="center" verticalAlign="middle" initialize="init()"> 

    <!-- Controller --> 
    <mx:Script> 
     <![CDATA[ 
       import mx.collections.XMLListCollection; 
       import mx.binding.utils.BindingUtils; 

       protected var _tally:Number = 3; 

       //RAW XML 
       [Bindable]protected var _model:XML = new XML("<model><option title='Option 1'/> <option title='Option 2'/> <option title='Option 3'/> </model>"); 

       //This should bind the children to the XMLLList BUT DOES NOT 
       [Bindable]protected var _list:XMLList = new XMLList(_model.children()); 

       //This Binds the _list to the _collection 
       [Bindable]protected var _collection:XMLListCollection = new XMLListCollection(_list); 


       //ADDS NEW DATA TO MODEL 
       protected function updateModel():void 
       { 
        _tally++; 
        _model.appendChild(new XML("<option title='Option " + _tally + "'/>")) 
        trace(_model) 
       } 

     ]]> 
    </mx:Script> 

    <!-- View --> 
    <mx:Panel title="Combo Binding Test" > 
     <mx:ComboBox id="_combo" width="100%" labelField="@title" dataProvider="{_collection}" /> 
     <mx:Text id="_text" height="100" width="300" selectable="false" text="{_model}" /> 
     <mx:ApplicationControlBar width="100%" dock="true"> 
      <mx:Button label="Update Model" click="updateModel()" /> 
     </mx:ApplicationControlBar> 
    </mx:Panel> 

</mx:Application> 

(J'espère que a formaté ok!)

Quand je prévisualise ce que je peux voir que les liaisons ont mis les données dans les bons endroits, mais quand je mets à jour le XML avec plus de données, la vue ne met pas à jour.

2 problèmes existent:

  1. Lorsque je supprime les « enfants() » de la _list.dataProvider, les mises à jour en utilisant les liaisons ComboBox, mais je dois lire les enfants, de sorte que les fixations échouent.

  2. Malgré que le modèle soit défini comme pouvant être lié, le texte ne se met JAMAIS à jour.

Pourquoi se lier aux enfants()?

J'ai créé un composant personnalisé qui recevra différents ensembles de données de son parent. Dans ce composant personnalisé se trouve un contrôle ComboBox qui doit afficher les enfants des données. Si je ne peux pas lier les enfants, il se peut que je doive coder en dur un composant unique chaque fois qu'il est utilisé.

Par exemple, une fois par exemple des données pourrait être:

<locations> 
<option title="Hampshire"/> 
<option title="Warwickshire"/> 
<option title="Yorkshire"/> 
</locations> 

Une autre pourrait être:

<stock> 
<option title="Hammer"/> 
<option title="Drill"/> 
<option title="Spanner"/> 
</stock> 

Il est donc important pour moi de se lier aux enfants().

Est-ce possible et si non, quelqu'un sait-il comment je vais contourner ce problème?

Un conseil à ce sujet serait grandement apprécié.

Répondre

0

C'est ici que vous devriez utiliser les getters et les setters. Par exemple:

private var _list:XMLList; 

[Bindable] 
public function get list() : XMLList { 
    return _list; 
} 

public function set list(value:XMLList) : void { 
    _list = value; 
    // also can try list.refresh() here if this doesn't do the job 
} 

Puis, en commitProperties (ou creationComplete, ou autre) faire quelque chose comme:

override protected function commitProperties() : void { 
    super.commitProperties(); 
    if (_model && _model.children.length > 0) { 
    list = _model.children(); // or use E4X as _model..option 
    } 
}