2009-12-07 32 views
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)

您能幫助我嗎?非常感謝你們。

回答

0

如果您聆聽dataChange事件,它可以觸發處理程序。