Ссылка на DataGrid равна NULL после отправки события - PullRequest
0 голосов
/ 07 декабря 2009

Я абсолютный новичок в Flex и борюсь с моделью событий. У меня есть следующий сценарий:

  • с DataGrid с параметром dataProvider, установленным в ArrayCollection
  • Сетка данных представляет собой простой список дел, первый столбец содержит флажок в качестве средства визуализации элементов
  • другие столбцы - простые строки

Что мне нужно сделать, так это то, что после того, как сетка данных была создана или инициализирована, мне нужно условно обновить цветовой стиль значений средств визуализации элементов. Условие говорит, что если значение свойства Done (хранится в поставщике данных) равно true, тогда установите цвет текста на серый.

Проблема в том, что средства визуализации элементов инициализируются до создания сетки данных, поэтому ссылка на сетку данных, которую я могу получить в средстве визуализации элементов, равна NULL. Поэтому я решил уведомить средства визуализации элементов после того, как сетка данных будет завершена. Вопрос в том, как это сделать с помощью модели событий Flex.

Похоже, что событие, отправленное сеткой данных, не прослушивается средством визуализации элементов. Пожалуйста, посмотрите на мой код:

<!-- Data grid inside root panel main.mxml -->
<mx:DataGrid id="taskGrid" dataProvider="{tasks}" creationComplete="dispatchEvent(new Event('update',true));">
 <mx:columns>
  <mx:DataGridColumn dataField="done" headerText="!">
   <mx:itemRenderer>
     <mx:Component>
       <c:StatusCheckBox change="this.onChange(event);"/>
     </mx:Component>
   </mx:itemRenderer>
  </mx:DataGridColumn>
  <mx:DataGridColumn dataField="status" headerText="Status" editable="false" itemRenderer="components.CustomLabel"/>
 </mx:columns>
</mx:DataGrid>

<!-- components.CustomLabel.mxml -->
<mx:Label xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init();">
 <mx:Script >
   <![CDATA[
    import (...)
    private var dg:DataGrid; 
    private var tasks:ArrayCollection;

    private function init():void {
     dg = this.listData.owner as DataGrid;  
     addEventListener("update",updateStyle); 
     if (dg) Alert.show("dg is not null!"); // data grid is not null when init() finish
    }

    private function updateStyle(e:Event = null):void {
     if (dg) {
      if (listData.rowIndex < dg.dataProvider.length) {
       var task:Task = dg.dataProvider[listData.rowIndex] as Task;
        if (task.done) this.setStyle("color","Blue");
        else this.setStyle("color","Black");
       }
      } 
     }
   ]]>
  </mx:Script>
 </mx:Label>

Когда я запускаю свое приложение и создается сетка данных, запускается событие «обновление». Однако экземпляр сетки данных (dg), используемый в функции updateStyle в компоненте CustomLabel, имеет значение null. Почему теперь он нулевой? Как видно из метода init (), переменная dg не равна нулю (оповещение появляется для каждого экземпляра средства визуализации элементов)

Не могли бы вы мне помочь? Большое спасибо, ребята.

1 Ответ

0 голосов
/ 21 января 2010

Если вы слушаете событие dataChange, это может вызвать обработчик.

...