Flex Item Renderer – Item Renderer utilisant des composants personnalisés MXML (Inline)
Bien que les item renderer de type Drop-In soient très simples à implédmenter, ils sont aussi limités dans leur utilisation en termes de configuration. Par exemple, dans l'exemple de l'article: Flex Item Renderer - Item Renderer utilisant les composants Flex standard (Drop-In), vous pouvez afficher une CheckBox dans la colonne d'une DataGrid Flex, mais vous ne pourrez pas changer les propriétés du composant utilisé comme item renderer.
Les ItemRenderer Inline sont mieux que les Drop-In Renderer adns le sens que vous pouvez configurez les paramètres du composant utilisé pour l'affichage. Par exemple, vous pouvez utiliser un inline item renderer pour fixer la propriété "enabled" de la CheckBox pour la désactiver afin que l'utilisateur ne puisse pas cocher/décocher la CheckBox.
Les Item Renderer inline requièrent que vous leur spécifiez la valeur de "itemRenderer" en utilisant des blocs MXML imbriqués plutôt que des attributs. Vous devez ensuite insérer le tag mx:Component à l'intérieur du tag mx:itemrenderer pour créer votre composant utilisable comme itemRenderer.
L'exemple suivant spécifie une CheckBox, et désactive cette CheckBox pour que l'utilisateur ne puisse plus la cocher/décocher:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" viewSourceURL="srcview/index.html">
<mx:VBox>
<mx:DataGrid editable="false">
<mx:columns>
<mx:DataGridColumn headerText="Titre" dataField="title"/>
<mx:DataGridColumn headerText="Artist" dataField="artist"/>
<mx:DataGridColumn headerText="Dans les Favoris ?" dataField="inFavorites">
<mx:itemRenderer>
<mx:Component>
<mx:CheckBox label="Favoris?" enabled="false"/>
</mx:Component>
</mx:itemRenderer>
</mx:DataGridColumn>
</mx:columns>
<mx:dataProvider>
<mx:ArrayCollection>
<mx:Array>
<mx:Object songId="0" title="Astronaut" artist="David Byrne" inFavorites="true"/>
<mx:Object songId="1" title="Rio" artist="Duran Duran"/>
<mx:Object songId="2" title="Enjoy The Silence" artist="Depeche Mode"/>
<mx:Object songId="3" title="Mesopotamia" artist="B-52s" inFavorites="true"/>
</mx:Array>
</mx:ArrayCollection>
</mx:dataProvider>
</mx:DataGrid>
</mx:VBox>
</mx:Application>
Flex Source Code Download: Télécharger le code source complet de l'application
Le tag mx:Component est un tag MXML puissant. Il crée un nouveau scopeà l'intérieur du document MXML. Ce qui veut dire que ses variables deviennent locales. Le code à l'intérieur d'un tag Component est essentiellement du MXML, et les règles applicables au MXML sont applicables au tag Component. Vous pouvez seulement avoir un noeud root, et à l'intérieur de ce noeud root, vous pouvez utiliser Style et Script, et tous les tags MXML standards utilisés dans un document MXML classique.
Puisque le tag mx:Component crée son propre scope, vous n'avez pas à vous soucier des conflits entre le document et ce qui est à l'intérieur du tag. Cependant, cela veut aussi dire que vous ne pouvez pas référencer directement de la data issue du document MXML principal.
Par exemple, le code suivant va provoquer une erreur de compilation :
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" >
<mx:Script>
<![CDATA[
private var maximumCount:uint = 5;
]]>
</mx:Script>
<mx:List>
<mx:itemRenderer>
<mx:Component>
<mx:NumericStepper maximum="{maximumCount}"/>
</mx:Component>
</mx:itemRenderer>
</mx:List>
</mx:Application>
1120: Accès à la propriété non définie maximumCount.
Cette erreur se produit car maximumCount est défini dans le document MXML, mais il est mis en référence dans le composant Component, qui a un scope différent. Bien que le tag mx:Component soit puissant, il est recommandé pour l'utiliser dans des cas encore simple, comme l'exemple précédent où on définit un label et enabled. Si vous devez créer des composants plus sophistiqués, il est bien mieux de les définir dans de nouveaux composants MXML ou ActionScript (prochain article).
Notez que pour résoudre le problème de l'exemple précédent, vous pouvez utiliser la propriété outerDocument dans un tag Component pour référencer le document MXML contenant le tag Component. Vous pouvez ainsi référencer toute propriété public ou internal comme dans cet exemple:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" >
<mx:Script>
<![CDATA[
internal var maximumCount:uint = 5;
]]>
</mx:Script>
<mx:List>
<mx:itemRenderer>
<mx:Component>
<mx:NumericStepper maximum="{outerDocument.maximumCount}"/>
</mx:Component>
</mx:itemRenderer>
</mx:List>
</mx:Application>
Articles similaires
- Flex Item Renderer – Item Renderer utilisant les composants Flex standard (Drop-In)
- Flex Item Renderer – Utiliser la propriété itemEditor pour la mise à jour
- Flex Item Renderer – Item Renderer utilisant des composants personnalisés (MXML Component)
- Flex Item Renderer – Créer un ItemRenderer réutilisable avec listData
- Flex Drag And Drop – Drag And Drop natif avec dragEnabled et dropEnabled






21 septembre 2009
Encore un tuto de qualité, merci
Cependant, deux petites (toutes petites) idées
-Pour éviter que la couleur du texte ne soit grisée :
fixer disabledColor à 0x000000,
-Pour éviter que la check box ne soit désactivée :
ajouter un eventListener sur le click pour que ....selected = !(....selected)
Cela permet de laisser la check box active, au cas où l'on veuille exécuter un traitement tout en ne modifiant pas son état.
PS : le lien sur fond vert est cassé, ce qui n'est pas bien grave, le source étant disponible au-dessus
21 septembre 2009
C'est corrigé pour le lien
Fabien
4 mai 2010
Salut,
Merci beaucoup pour vos tutos, ils me sont très utiles et super bien fait.
Vous pouvez p-e m'aider à surmonter mon probleme actuel :
Je voudrais mettre une combobox dans une des colonnes de ma datagrid(qui est remplie par des données venant d'une bdd via binding) et que cette combobox ai un comportement spécial :
* qu'elle ai deux champs liés chacun à une valeur de champs de ma bdd (libellé de valeur a zero et valeur a un)
* que son index soit lié a une valeur numerique venant de la bdd
Si ca peut vous aider j'ai deja eu à coder ce genre de comportement avec Silverlight et ça donnait ceci(SL et Flex se ressemble assez, mais je n'arrive pas a reproduire ce comportement sous flex):
ce code me permet a chaque changement de la combobox de mettre a jour la bdd immediatement.
Les exemples que j'ai trouvé avec des combobox dans des datagrids sous flex sont tous avec des combobox dont le contenu est statique et connu a l'avance.
Encore merci pour vos tutos qui m'ont aider dans mon appli, j'espere que vous pourrez me debbloquer.
Cordialement,
Arnaud.
4 mai 2010
Salut Arnaud,
Bon le code SL est mal passé, mais c'est pas grave. Si j'étais à ta place, je ferai un itemRenderer perso (ou alors un itemEditor perso si tu veux que tu ai au départ ton enregistrement sous forme de label puis sous forme de ComboBox au double-clic.
Bref, Il faut que dans ton dataProvider, pour le champ correspondant à la colonne dans laquelle tu vas mettre ta ComboBox, tu passes un Array ou un ArrayCollection avec toutes tes données.
Pour ton itemRenderer, tu peux créer une VBox contenant une ComboBox. Tu override l'accesseur sur data (override public function set data(value:Object){super.data = value...}.
Dans "value", tu vas trouver ta donnée, ton Array. Il ne te reste qu'à remplir la CB avec cette donnée. Après, si tu veux mettre à jour ta BDD, tu t'abonnes à l'evenement ListEvent.CHANGE de la combobox et tu dispatches un évènement contenant ta data. Ton application capte cet evenement et met à jour ta BDD en conséqence.
Have fun !
Fabien
5 mai 2010
Salut,
Merci pour cette réponse rapide. J'ai testé hier le renderer avec une VBox en essayant d'adapter le modele de http://philflash.inway.fr/flex/dgRendererSimple/index.html, ca me permet bien d'avoir une combobox dans la datagrid.
Mon probleme est que je voudrais bind certaines propriétés de la combobox avec des variables venant de ma page principale, or mon renderer est déclaré dans un fichier différent.
Je vais essayer de remettre mon code xaml SL, je pense que ca peut aider parce que ce que j'essaye de faire n'est pas très compliquer, mais assez dur a expliquer clairement a l'ecrit
xaml :
Avec coté script une collection fournissant les données à la datagrid.
Encore merci pour ton aide précieuse,
Arnaud.
5 mai 2010
Désolé pour le double post
Apparemment c'est les balises qui bloquent pour le xaml,
data:DataGridTemplateColumn Header="valeur" Width="120"
data:DataGridTemplateColumn.CellTemplate
DataTemplate>
ComboBox SelectedIndex="{Binding valeur, Mode=TwoWay}"
ComboBoxItem Content="{Binding libValZero}"
ComboBoxItem Content="{Binding libVarUn}"
Normalement la ça devrait passer, j'ai enlevé les ouvertures et fermeture de balises, sinon c'est que vous êtes allergiques au xaml
5 mai 2010
Salut,
effectivement, les tags XML passent mal et parfois les balises mxml ou as ne font rien, je ne sais pas trop pourquoi ^^
Ton itemRenderer est dans un scope local au composant, il n'est pas dans le scope applicatif. Cependant, tu peux accèder à ton document parent avec outerDocument (voir les autres tutos sur itemRenderer) ou alors par la variable owner de ListData il me semble
Fabien