2010-12-27 15 views
0

私はこのように定義されたクラスがあります。奇妙な行動

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; 
    } 

を私は、WCFサービスからこのタイプ(写真)の多様なオブジェクトを取得M(正常に動作します!)。これらのオブジェクトは、次のように定義されたArrayCollectionに格納されています。

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

私のように使用してこれらの写真を表示したい:

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

アイテムレンダラーがこのように定義されています。このように、Listコンポーネント

<?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> 

s:Labelコンポーネントは正しく表示されますが、mx:Imageコンポーネントは常に同じイメージを表示します(これが最初のイメージか最後の配列かわかりません)。 私は何が欠けていますか? ありがとうございます

答えて

0

作成完了はレンダラーが初めて作成されたときにのみ呼び出されます。 Flexはレンダラーを再利用するため、最初に呼び出されるだけです。 creationCompleteを使用する代わりに、レンダラーのset dataメソッドをオーバーライドします。残念ながら、s:ItemRendererにはset dataメソッドがありませんので、代わりにmx:HBoxコンポーネントを使用します。ここで

はあなたが始めるために簡単な例です:

<?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

こんにちはJason!あなたが言うことを正しく解釈すれば、画像をこのようにバインドすることができるはずです(s:ItemRendererを使用して) これはうまくいかない:私は同じ結果を得ている!しかし、私はあなたの提案をしようとすると...何が起こるかを参照してください! –

+0

別のオプションは、ItemRendererのupdateDisplayListメソッドをオーバーライドして、ラベルとイメージの値を設定することです。また、あなたのPhotoクラスが[Bindable]であると仮定していますか? –

+0

私はサーバーサイドコード(WCFサービス)で手術を行い、画像が正しくDBMSに挿入されていることを確認しました。私はまた、最後のイメージが常に描かれていることに気付きました! –

1

Ahhm !!この私のエラーことが判明します!上の私は、サービスが正常に実行されていると述べた:推測何...それはなかった!サービスを修正すると、画像が正しく表示されました!

+0

あなたはすべてが稼働していると聞いてうれしいです。 –