在itemrenderer中处理数据对象 - Adob​​e Flex 4

时间:2011-01-26 10:39:56

标签: actionscript-3 flex4 adobe

我有一个简单的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">
<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对象时,它总是空的!有没有办法在绑定之前操纵数据对象?可能我不必使用this.data,但我找不到任何其他对象来编辑

3 个答案:

答案 0 :(得分: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 :(得分: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 :(得分:1)

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