Actionscript 3 DataGrid项目渲染器

Actionscript 3 DataGrid项目渲染器,actionscript-3,apache-flex,datagrid,itemrenderer,Actionscript 3,Apache Flex,Datagrid,Itemrenderer,事情是这样的:我有一个DataGrid,它包含一个列,用于处理一些操作。因此,这个DataGrid有几个数据列,最后是这个特殊的列。 在这个名为“操作”的特殊列中,有两个图标;其中一个显示了一个像小铃铛一样的警报图标。所以,我要完成的是,最初警报图标显示为不可见;当用户通过另一个界面设置报警时,报警图标以默认样式颜色显示,当触发报警时,报警图标应采用另一种样式颜色,如黄色 我有下一个定义: <mx:DataGrid id="dgSomeValues" dragEnabled="tru

事情是这样的:我有一个DataGrid,它包含一个列,用于处理一些操作。因此,这个DataGrid有几个数据列,最后是这个特殊的列。 在这个名为“操作”的特殊列中,有两个图标;其中一个显示了一个像小铃铛一样的警报图标。所以,我要完成的是,最初警报图标显示为不可见;当用户通过另一个界面设置报警时,报警图标以默认样式颜色显示,当触发报警时,报警图标应采用另一种样式颜色,如黄色

我有下一个定义:

<mx:DataGrid id="dgSomeValues"
   dragEnabled="true"
   draggableColumns="false"
   width="100%" height="100%"
   horizontalScrollPolicy="off"
   resizableColumns="true"
   rowHeight="19">
<components:columns>
    <mx:DataGridColumn id="dgcItem" headerText="{resourceManager.getString('resources','columnItem')}" width="70" resizable="false"/>
    <!--
    Some other dataGridColumns
    -->
    <mx:DataGridColumn id="dgcOperation" headerText=" " width="50" resizable="false">
        <mx:itemRenderer>
            <fx:Component>
                <components:OperationItemRenderer/>
            </fx:Component>
        </mx:itemRenderer>
    </mx:DataGridColumn>
</components:columns>
函数upgradeIcon它应该从应用程序中的另一个部分调用,在该部分中,每次刷新DataGrid的数据源时都会调用一个rowFunction。在这个rowFunction中,我想找到一种访问DataGrid ItemRenderer的方法,这样我就能够调用这个upgradeIcon函数

问题是,如何以编程方式访问DataGrid的ItemRenderer?我已经试过的是这样的:

import flash.events.MouseEvent;

import com.broker.control.BrokerEvent;
import mx.containers.HBox;

public class OperationItemRenderer extends HBox
{
    //--------------------------------------------------------------------------
    //
    //  Variables
    //
    //--------------------------------------------------------------------------
    /**
     *  Alarm Button --> bell
     **/
    private var btnAlarm:Icon;

    //--------------------------------------------------------------------------
    //
    //  Constructor
    //
    //--------------------------------------------------------------------------
    /**
     *  Constructor
     **/
    public function OperationItemRenderer()
    {
        super();

        this.setStyle("horizontalGap",0);
    }

    //--------------------------------------------------------------------------
    //
    //  Overridden methods
    //
    //--------------------------------------------------------------------------

    /**
     *  @inheritDoc
     **/
    override public function set data(value:Object):void
    {                   
        super.data = value;
    }

    /**
     *  @inheritDoc
     **/
    protected override function createChildren():void
    {
        super.createChildren();

        if (!btnAlarm){
            btnAlarm = new Icon();

            btnAlarm.styleName = "";    // Initially do not shows any icon.

            btnAlarm.enabled = true;
            btnAlarm.addEventListener(MouseEvent.CLICK, btnAlarmClickHandler,false,0,true);

            addChild(btnAlarma);
        }
    }

    override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
    {
        super.updateDisplayList(unscaledWidth, unscaledHeight);

        if (btnAlarm){
            btnAlarm.width = unscaledWidth/2;
            btnAlarm.height= unscaledHeight;
        }
    }

    //--------------------------------------------------------------------------
    //
    //  Methods
    //
    //--------------------------------------------------------------------------

    /**
     * If this item has an alarm, then it will show an icon.
     * States for alarm icon are: Default --> icnAlarmOff
     *                            Fired   --> icnAlarm
     */
    public function upgradeIcon(toogle:Boolean):void 
    {
        btnAlarm.styleName = toogle ? "icnAlarm" : "icnAlarmOff";
    }

    //--------------------------------------------------------------------------
    //
    //  Event Handlers
    //
    //--------------------------------------------------------------------------

    protected function btnAlarmaClickHandler(event:MouseEvent):void
    {   
        if (btnAlarm.styleName == "favIcnAlarma") {
            var evt:BrokerEvent;
            evt = new BrokerEvent(BrokerEvent.SETUP_ALARM);

            dispatchEvent(evt);
        }
    }
}
var c:ClassFactory = view.dgcOperation.itemRenderer as ClassFactory;
if (c != null && c.generator != null) { // c never is null at this point
    var f:OperationItemRenderer = c.generator as OperationItemRenderer;
    f.upgradeIcon(change);  // f it's always null
    //(c.generator as OperationItemRenderer).upgradeIcon(change);
}
但这种方法行不通。任何帮助都将不胜感激


提前谢谢

在用户设置报警时尝试调度事件…并在渲染器中添加此事件的侦听器,以便在设置新报警时,将从报警界面调度事件,并被捕获到渲染器中,该渲染器将更新图标样式。

您的datagrid必须有一个值对象的数据提供者,比如说Report是您的类的名称。如果已将报表类标记为可绑定,则其任何属性中的任何更改都将分派PropertyChangeEvent,然后您可以覆盖项呈现器中的set Data方法,并根据该属性的值采取必要的操作


ItemRenders是回收的,在这种情况下获取它们是一种不好的做法。您不应该直接更改ItemRenderer,而应该更改底层对象

谢谢大家!!我将尝试这种方法。