2010-07-21 5 views
0

Ma configuration est assez basique. J'ai un s: Liste avec un itemRenderer personnalisé et un fournisseur de données. Ce que je voudrais faire, c'est accéder aux instances générées du rendu d'élément mais je n'ai aucune idée de comment.Accès à l'élément itemRenderer flash buiilder 4

Voici le code de la liste:

<s:List id="layersList" 
      borderVisible="false" 
      allowMultipleSelection="true" 
      contentBackgroundAlpha="0" 
      itemRenderer="renderers.LayerRenderer" 
      dataProvider="{AssetsCollection}"> 
    <s:layout> 
    <s:VerticalLayout gap="1" />   
    </s:layout> 
<s:list> 

Ce que je voudrais est d'accéder aux équarrisseurs générés comme:

layersList.renderers[selectedIndex] or layersList.selectedItems[0].renderer. Afin d'accéder à certains de ses objets internes. Comme dans l'événement, je voudrais écouter les événements distribués dans l'instance de rendu à partir du parent de la liste.

Quelqu'un peut-il aider?

+0

On pourrait commencer à répondre à votre question et commencer à parler des méthodes ClassFactory, etc. Mais je pense qu'il serait préférable que vous affichiez du code pour donner une image claire de ce que vous essayez d'accomplir. –

+0

J'ai ajouté le code, merci. – Tarek

Répondre

1

Le modèle conceptuel de Lists/ItemRenderers est qu'ils sont une représentation des éléments dans le fournisseur de données. Une raison pour garder cela à l'esprit est que les listes recyclent leurs ItemRenderers afin de réduire l'empreinte mémoire. Cela signifie que vous pouvez avoir 100 éléments dans votre dataProvider, mais seulement un petit sous-ensemble de ceux-ci auront des ItemRenderers qui leur sont associés, et certains d'entre eux ne seront même pas visibles à l'écran ou même plus valables. Il y a plusieurs façons d'approcher vos ItemRenderers dans votre liste en reflétant l'état du parent de la liste sans avoir à manipuler directement les moteurs de rendu. Par exemple, vous pouvez faire quelque chose comme ceci:

<s:List id="layersList" 
     borderVisible="false" 
     allowMultipleSelection="true" 
     dataProvider="{AssetsCollection}" 
     contentBackgroundAlpha="0"> 
    <s:layout> 
     <s:VerticalLayout gap="1" />  
    </s:layout> 
    <s:itemRenderer> 
     <fx:Component> 
      <myrenderers:TestRenderer myState="{outerDocument.someState}"/> 
     </fx:Component> 
    </s:itemRenderer> 
</s:List> 

Où TestRenderer a une propriété publique pouvant être liée appelée myState. Et le parent de la liste a une propriété bindable appelée "someState". Ensuite, à l'intérieur de votre moteur de rendu, vous pouvez définir une logique conditionnelle basée sur la valeur de myState. J'espère que cela pourra aider.

+0

Pas tout à fait la réponse que j'espérais. Mais le moins, je comprends pourquoi alors merci Wade. – Tarek

+0

Juste une petite question de suivi. Les rendus ne sont-ils pas recyclés uniquement si la mise en page virtuelle est activée? – Tarek

+0

Bon point, useVirtualLayout a la valeur true par défaut. Vous pouvez désactiver cela, mais il n'est pas recommandé de travailler directement avec les moteurs de rendu et mon expérience dans ce domaine a été problématique au mieux. –