2011-07-13 2 views
2

Dans Flex 3, il était auparavant possible de lier une propriété de composant dans un itemRenderer via outerDocument. Ainsi, par exemple, s'il y avait une image à l'intérieur d'un itemRenderer qui n'a été affiché sur une condition donnée du parent, quelque chose comme cela fonctionne parfaitement:Adobe Flex 4.5 Spark: liaison du composant ItemRenderer au parent

<mx:itemRenderer> 
<mx:Component> 
    <mx:Label text="{data}"/> 
    <mx:Image id="img" visible="{outerDocument.ShowImage}" includeInLayout="{outerDocument.ShowImage}"/> 
</mx:Component> 
</mx:itemRenderer> 

où le document externe (pas la liste, mais le MXML la liste est) contenu quelque chose comme

[Bindable] 
public function get ShowImage():void 
{ 
return showImage; 
} 
public function set ShowImage(val:Boolean):void 
{ 
showImage = val; 
} 

J'ai essayé de faire la même chose dans Flex 4.5 en utilisant renderers élément Spark en utilisant parentDocument, mais il ne semble pas être au courant de la liaison. Lorsque je fais cela dans Flex 4.5, le itemRenderer ne semble pas savoir quand le parentDocument ShowImage change.

Quelqu'un at-il vu ce problème et est en mesure d'offrir une solution?

EDIT: Ajouter Spark Source Comme l'a demandé ici est ma source d'allumage:

MyItemRenderer.mxml

<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:s="library://ns.adobe.com/flex/spark" 
       xmlns:mx="library://ns.adobe.com/flex/mx"> 
<s:Label id="myLabel" text="{data}/> 
<s:Image src="something.png" visible="{parentDocument.ShowImage}" includeInLayout="{parentDocument.ShowImage}"/> 
</s:ItemRenderer> 

RendererContainer.mxml

<s:Panel 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[ 

private var showImage:Boolean = false; 

[Bindable] 
public function set ShowImage(val:Boolean):void 
{ 
    showImage = val; 
} 
public function get ShowImage():Boolean 
{ 
    return showImage; 
} 
]]> 
    </fx:Script> 
    <!-- Content Group --> 
    <s:List id="lstCell" width="100%" height="100%" itemRenderer="MyItemRenderer">  
    </s:List> 
</s:Panel> 

Ok, donc il y a une case à cocher dans un wrapper en dehors de RendererContainer.mxml qui distribue un événement personnalisé qui est géré en modifiant un Boolean Bindable. La modification de var modifie alors la propriété ShowImage sur mon composant RendererContainer. Je m'attendrais à ce que MyItemRenderer récupère la liaison, mais cela ne semble pas fonctionner.

Donc, mon enveloppe extérieure accéderait ShowImage comme celui-ci

<comp:RendererContainer id="myId" ShowImage="{myCheckbox.selected}"/> 
+0

Afficher le code pour l'exemple 4.5. –

+0

Normalement, pour créer un objet Bindable, vous devez spécifier un événement dans la balise Bindable Metadata et distribuer cet événement à partir de la méthode set. Cela dit, avez-vous des erreurs? OU la valeur dans itemRenderer ne change tout simplement pas? – JeffryHouser

+0

Pas d'erreur. Le itemRenderer n'est pas en train de se mettre à jour. Fondamentalement, j'ai un "panneau de contrôle" qui contient des options pour ce qui peut être affiché dans le itemRenderer. Le panneau de contrôle a juste une case à cocher qui distribue un événement lorsque la valeur change.Le gestionnaire de cet événement met à jour la propriété ShowImage (qui est marquée Bindable) mais lorsque je coche la case, je ne vois tout simplement pas les images apparaître ou disparaître dans l'itemrenderer. Mauvais poster le code pour le 4.5 – Shawn

Répondre

1

Votre getter semble avoir le type de retour comme vide. Un changement qui Boolean

[Bindable] 
public function get ShowImage():Boolean 
{ 
return showImage; 
} 
public function set ShowImage(val:Boolean):void 
{ 
showImage = val; 
} 
+1

Si c'était en fait, je pense qu'il y aurait une erreur de compilation. –

+1

+1 pour la capture. Cependant, je ne suis pas sûr que ce soit un vrai problème de code ou une erreur de couper-coller de l'affiche originale. – JeffryHouser

+0

+1 @Ranhiru - oui, vous auriez une erreur de compilateur pour void sur un getter :) – Nate

1

Je pense que cela devrait faire l'affaire pour vous, YourTypeHere serait la classe de l'objet contenant , assurez-vous que la propriété ShowImage est public et peut être liée.

<mx:itemRenderer> 
    <mx:Component> 
    <mx:Script> 
     <![CDATA[ 
      import YourTypeHere; 
     ]]> 
    </mx:Script> 
     <mx:Label text="{data}"/> 
     <mx:Image id="img" 
     visible="{YourTypeHere(this.parent.ShowImage)}" 
     includeInLayout="{YourTypeHere(this.parent.ShowImage)}"/> 
    </mx:Component> 
</mx:itemRenderer> 

P.s. s'il vous plaît ne pas nommer les propriétés avec une lettre majuscule de départ, y compris les getters, envisager de le nommer showImage et votre var privé à quelque chose comme _showImage à la place: D

+0

Cela ne fait rien. J'ai ceci fonctionnant dans le Flex 3. L'idée est d'obtenir la liaison pour fonctionner dans l'étincelle 4.5. – Shawn

1

Cela aidera.

<s:Image src="something.png" visible="{RendererContainer(ListSkin(parentDocument).parentDocument).ShowImage}" includeInLayout="{RendererContainer(ListSkin(parentDocument).parentDocument).ShowImage}"/> 
+0

Désolé, cela n'a pas aidé. – Shawn

+1

Étrange. J'ai utilisé vos sources et cela a fonctionné pour moi. Quoi qu'il en soit, essayez de chercher dans le débogage ce qu'est parentDocument. Votre liaison n'a pas fonctionné parce que parentDocument n'est pas RendererContainer et que flex ne met pas d'exceptions quand la liaison dans mxml est utilisée. – grass

1

Après fonctionne parfaitement bien:

<?xml version="1.0" encoding="utf-8"?> 
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
         xmlns:s="library://ns.adobe.com/flex/spark" 
         xmlns:mx="library://ns.adobe.com/flex/mx"> 
    <s:layout> 
     <s:VerticalLayout/> 
    </s:layout> 
    <fx:Script> 
     <![CDATA[ 
      import mx.collections.ArrayCollection; 
     ]]> 
    </fx:Script> 
    <fx:Declarations> 
     <!-- Place non-visual elements (e.g., services, value objects) here --> 
    </fx:Declarations> 
    <s:Panel xmlns:fx="http://ns.adobe.com/mxml/2009" 
      xmlns:s="library://ns.adobe.com/flex/spark" 
      xmlns:mx="library://ns.adobe.com/flex/mx"> 
     <s:layout> 
      <s:VerticalLayout/> 
     </s:layout> 
     <fx:Script> 
      <![CDATA[ 

       private var showImage:Boolean = false; 

       [Bindable] 
       public function set ShowImage(val:Boolean):void 
       { 
        showImage = val; 
       } 
       public function get ShowImage():Boolean 
       { 
        return showImage; 
       } 
      ]]> 
     </fx:Script> 
     <s:CheckBox label="Select" change="{ShowImage = !ShowImage}"/> 
     <!-- Content Group --> 
     <s:List id="lstCell" width="100%" height="100%" dataProvider="{new ArrayCollection(['A','B'])}"> 
      <s:itemRenderer> 
       <fx:Component> 
        <s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
            xmlns:s="library://ns.adobe.com/flex/spark" 
            xmlns:mx="library://ns.adobe.com/flex/mx" 
            autoDrawBackground="true"> 
         <s:layout> 
          <s:HorizontalLayout/> 
         </s:layout> 
         <s:Label id="myLabel" text="{data}"/> 
         <s:Button label="something.png" visible="{outerDocument.ShowImage}" includeInLayout="{outerDocument.ShowImage}"/> 
        </s:ItemRenderer> 
       </fx:Component> 
      </s:itemRenderer> 
     </s:List> 
    </s:Panel> 

</s:WindowedApplication> 
+0

Malheureusement, comme indiqué ci-dessus, l'itemrenderer est dans une classe distincte plutôt qu'inline, donc cela ne fonctionne pas. – Shawn

+0

Je l'ai encore testé juste pour m'assurer que je n'avais pas manqué quelque chose et que la liaison ne se produisait toujours pas. Merci pour votre aide. – Shawn

Questions connexes