我是一个完整的Flex新手,我在与事件模型斗争。我有以下情况:
我需要实现的是,在创建或初始化数据网格后,我需要有条件地更新项呈示器值的颜色样式。条件是,如果属性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)为null。 为什么它现在为空?正如您在init()方法中看到的那样,dg变量不为null(为项目渲染器的每个实例弹出警报)
你可以帮帮我吗?非常感谢你们。答案 0 :(得分:0)
如果您收听dataChange
事件,则可以触发处理程序。