首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataGrid ItemRenderer

DataGrid ItemRenderer
EN

Stack Overflow用户
提问于 2015-04-29 23:07:10
回答 2查看 402关注 0票数 0

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

所以,我有下一个定义:

代码语言:javascript
复制
<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>

OperationItemRenderer的定义如下:

代码语言:javascript
复制
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);
        }
    }
}

函数"upgradeIcon“它应该从应用程序的另一个部分调用,每次刷新DataGrid的数据源时都调用一个rowFunction。在这个rowFunction中,我想找到一种访问DataGrid ItemRenderer的方法,这样我就可以调用这个upgradeIcon函数了。

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

代码语言:javascript
复制
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);
}

但这种方法行不通。任何帮助都将不胜感激。

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-01 22:54:59

当用户设置alarm...and在呈现器中添加此事件的侦听器时,尝试分派事件,因此当设置新警报时,将从您的警报接口发送一个事件,并在呈现器中捕获该事件,这将更新您的图标样式。

票数 0
EN

Stack Overflow用户

发布于 2015-05-02 15:18:15

您的数据集必须有一个值对象的数据提供程序(例如,Report是类的名称)。如果您已经标记了可绑定的Report类,那么它的任何属性中的任何更改都会分派PropertyChangeEvent,然后您可以在item-renderer中重写set Data方法,并根据该属性的值采取必要的操作。

ItemRenderers是回收的,在这个过程中获取它们是一种糟糕的做法。不应直接更改ItemRenderer,而应更改基础对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29956169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档