2015-04-29 6 views
0

Вот что: у меня есть DataGrid, который содержит столбец с целью обработки некоторых действий. Итак, этот DataGrid имеет несколько столбцов данных, и в конце есть специальный столбец. В этом специальном столбце под названием «операции» есть две иконки; один из них показывает значок тревоги (например, маленький колокольчик). Итак, что я должен сделать, так это то, что изначально значок тревоги отображается невидимым; когда пользователь устанавливает тревогу (через другой интерфейс) появляется значок тревоги (со стандартным цветом стиля), и когда пришло время запускать будильник, символ тревоги должен принимать другой цвет стиля (например, желтый).DataGrid ItemRenderer

Итак, у меня это следующее определение:

<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 это так:

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" он должен быть вызван из другой раздел приложения, где функция rowFunction вызывается каждый раз, когда источник данных DataGrid обновляется. В этой строке Function я хочу найти способ доступа к DataGrid ItemRenderer, чтобы таким образом я смог вызвать эту функцию upgradeIcon.

Вопрос в том, как я могу обращаться к ItemRenderer DataGrid программно? Я уже пробовал что-то вроде этого:

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

Но этот подход не работает. Любая помощь будет высоко оценена.

Заранее благодарен!

ответ

0

попытаться отправить событие, когда пользователь установил будильник ... и добавить слушателя этого события в ваш рендер, поэтому, когда установлен новый будильник, событие будет отправлено из вашего интерфейса сигнализации и будет записано в вашем который обновит ваш стиль значка.

+0

Спасибо! Я попробую этот подход. – GummDev

0

Ваш datagrid должен иметь поставщик данных объектов значений (например, Report - это имя вашего класса). Если вы отметили свой класс привязки Report, то любое изменение в любом из его свойств отправит PropertyChangeEvent, а затем вы можете переопределить метод set Data в рендерере элементов и на основании значения этого свойства вы должны были предпринять необходимые действия.

ItemRenderers перерабатываются, и их получение в этом случае является плохой практикой. Вы не должны изменять ItemRenderer напрямую, а не изменять базовый объект.

+0

Спасибо @ahil_mittal за ответ! Это полезно на деле. – GummDev

Смежные вопросы