2010-12-27 10 views
0

Ich habe eine Klasse wie folgt definiert: (! Funktioniert)seltsames Verhalten von benutzerdefinierten Elementrenderer in Flex 4

public class Photo 
    { 
     public function Photo() 
     { 
     } 
     public var PhotoId:int; 
     public var Title :String; 
     public var Subtitle :String; 
     public var PhotoByteArray:ByteArray ; 
     public var ThumbnailByteArray:ByteArray; 
     public var ShowOnlyInFrontpageTop:Boolean; 
     public var ShowInFrontpageGroup:Boolean; 
     public var BackgroundColorGradientFrom:String; 
     public var BackgroundColorGradientTo:String; 
     public var IsActive :Boolean; 
    } 

Ich bin immer diverse Objekte dieses Typs (Foto) aus einem WCF-Dienst. Diese Aufgaben werden in einer Arraycollection definiert wie folgt gespeichert:

public static var GroupPhotos:ArrayCollection = new ArrayCollection(); 

Ich möchte diese Fotos zeigen, mit wie: List-Komponente, wie folgt aus:

<s:List height="110" id="GroupPhotos" itemRenderer="MyGroupPhotoRenderer"> 
       <s:layout > 
        <s:HorizontalLayout requestedColumnCount="3" /> 
       </s:layout> 
      </s:List> 

Der Elementrenderers auf diese Weise definiert ist:

<?xml version="1.0" encoding="utf-8"?> 
<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" 
       creationComplete="onItemrenderer_creationCompleteHandler(event)"> 
    <fx:Script> 
     <![CDATA[ 
      import mx.controls.Alert; 
      import mx.events.FlexEvent; 

      //when the item has been rendered and is ready to be shown the following method will be called 
      protected function onItemrenderer_creationCompleteHandler(event:FlexEvent):void 
      {    
       img.source = data.ThumbnailByteArray; 
      } 

     ]]> 
    </fx:Script> 

    <s:Group id="PhotoGroup" width="297" height="110" > 
     <!--<s:Rect id="imgRectangle" alpha="0" width="95" height="65"> 
      <s:stroke> 
       <s:LinearGradientStroke weight="{GroupBoxBorderWeight}" scaleMode="none"/> 
      </s:stroke> 
     </s:Rect>--> 
     <mx:Image id="img" 
        width="{PhotoGroup.width}" height="{PhotoGroup.height}" 
        /> 
     <s:Label id="title"     
       fontSize="20" 
       text="{data.Title}"/> 
    </s:Group> 
</s:ItemRenderer> 

Die Komponente s: Label wird korrekt angezeigt, während die Komponente mx: Image immer das gleiche Bild zeigt (weiß nicht, ob dies das erste Bild oder das letzte im Array ist). Was fehlt mir? Vielen Dank im Voraus

Antwort

0

Die Erstellung abgeschlossen wird nur beim erstmaligen Erstellen des Renderers aufgerufen. Da Flex Renderer wiederverwendet, bedeutet dies, dass es nur beim ersten Mal aufgerufen wird. Überschreiben Sie statt creationComplete die set data-Methode Ihres Renderers. Leider hat s:ItemRenderer keine set data Methode, also würde ich stattdessen eine mx:HBox Komponente verwenden.

Hier ist ein kleines Beispiel für den Einstieg:

<?xml version="1.0" encoding="utf-8"?> 
<mx:HBox 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[ 

      override public function set data(value:Object):void 
      { 
       super.data = value; 

       theLabel.text = value["Title"].toString(); 
       theImage.source = data.ThumbnailByteArray; 

       validateDisplayList(); 
      } 

     ]]> 
    </fx:Script> 
    <mx:Label id="theLabel" /> 
    <mx:Image id="theImage" /> 
</mx:HBox> 
+0

Hallo Jason! Wenn Sie richtig interpretieren, was Sie sagen, dann sollte ich (mit dem s: ItemRenderer) in der Lage sein, das Bild auf diese Weise zu binden Aber das funktioniert nicht: ich bekomme das gleiche Ergebnis! Aber ich werde versuchen, was Sie vorschlagen ... und sehen, was passiert! –

+0

Eine weitere Option wäre, zu versuchen, die updateDisplayList-Methode in Ihrem ItemRenderer zu überschreiben, um die Werte für Ihre Beschriftung und Ihr Bild festzulegen. Ich nehme auch an, dass deine Fotoklasse [Bindable] korrekt ist? –

+0

Ich habe eine Operation auf dem Server-Side-Code (WCF-Dienst) durchgeführt und überprüft, dass die Bilder korrekt in das DBMS eingefügt werden und daraus! Ich habe auch festgestellt, dass das letzte Bild immer gezeichnet wird! –

1

Ahhm !!, dass dieser mein Fehler stellte sich heraus! Oben sagte ich, dass der Service läuft gut: rate mal was ... es nicht! Durch die Reparatur des Dienstes wurden die Bilder korrekt angezeigt!

+0

Freut mich zu hören, dass alles funktioniert hat. –