0
我是Flex的新手,我很擔心事件模型。我有以下情形:事件發出後DataGrid引用爲NULL
- 有在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)爲null。 爲什麼它現在爲空?正如您在init()方法中看到的那樣,dg變量不爲null(對於項目渲染器的每個實例都彈出Alert)
您能幫助我嗎?非常感謝你們。