0

我是一个完全的 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>

当我启动我的应用程序并创建数据网格时,会触发“更新”事件。但是,CustomLabel 组件的 updateStyle 函数中使用的数据网格实例 (dg) 为空。为什么现在为空?正如您在 init() 方法中看到的 dg 变量不为空(对于项目渲染器的每个实例都会弹出警报)

你可以帮帮我吗?非常感谢你们。

4

1 回答 1

0

如果你监听dataChange事件,它可以触发处理程序。

于 2010-01-21T06:12:19.707 回答