2011-01-26 59 views
2

我有一个简单的itemRenderer用下面的代码:在itemRenderer的操纵数据对象 - Adob​​e Flex的4

<?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" width="90" height="90"> 
<s:VGroup horizontalAlign="center"> 
<mx:Image source="{data.photo}" toolTip="{data.name}" /> 
</s:VGroup> 
</s:ItemRenderer> 

我想操纵数据对象之前,它的绑定到图像的属性(源和工具提示)。为此,我通过这种方式修改了代码:

<?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" width="90" height="90" 
initialize="itemrenderer1_initializeHandler(event)"> 
<fx:Script> 
<![CDATA[ 
import mx.events.FlexEvent; 


protected function itemrenderer1_initializeHandler(event:FlexEvent):void 
    { 
    var obj:Object = this.data; 
    //here the manipulation 
    } 

]]> 
</fx:Script> 
<s:VGroup horizontalAlign="center"> 
<mx:Image source="{data.photo}" toolTip="{data.name}" /> 
</s:VGroup> 
</s:ItemRenderer> 

当我尝试访问this.data对象时,它始终为空!有没有办法在绑定之前操作数据对象?也许我不必使用这个数据,但我找不到任何其他对象来编辑

回答

1

我发现它!只有当ItemRenderer的创建完成时,我才能访问this.data对象!为此,我必须在creationComplete事件之后操作对象! 下面的代码:

<?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" width="90" height="90" 
       creationComplete="itemrenderer1_creationCompleteHandler(event)" 
       > 
    <fx:Script> 
     <![CDATA[ 
      import mx.events.FlexEvent; 
      import valueObjects.Product; 
      [Bindable] 
      private var prd:Product; 

protected function itemrenderer1_creationCompleteHandler(event:FlexEvent):void 
      { 
          //here i can access to the this.data object! 
          this.prd = this.data as Product; 
      } 

     ]]> 
    </fx:Script> 
    <s:VGroup horizontalAlign="center"> 
     <mx:Image source="{prd.photo}" toolTip="{prd.name}" width="70" /> 
     <mx:Label text="{prd.name}"/> 
    </s:VGroup> 
</s:ItemRenderer> 
2

另一个解决方案是重写的数据集功能,像这样:

<?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" width="90" height="90" 
      creationComplete="itemrenderer1_creationCompleteHandler(event)" 
      > 
<fx:Script> 
    <![CDATA[ 
     import mx.events.FlexEvent; 
     import valueObjects.Product; 
     [Bindable] 
     private var prd:Product; 

     override public function set data(value:Object):void 
     { 
      super.data = value; 
      //here i can access to the this.data object! 
      this.prd = this.data as Product; 
     } 

    ]]> 
</fx:Script> 
<s:VGroup horizontalAlign="center"> 
    <mx:Image source="{prd.photo}" toolTip="{prd.name}" width="70" /> 
    <mx:Label text="{prd.name}"/> 
</s:VGroup> 

1

虽然不是一个新的线程,不与CreationComplete去。该事件仅被调用一次。只要主管组件决定应该重新使用itemRenderer,数据就会被设置。例如。 useVirtualLayout = true作为列表。