在开发具有子窗体,或者itemrenderer的应用时,常常涉及到子窗体向父窗体传递参数或者从itemrenderer内的控件向外部的主程序传递参数的需求。这些都可以通过事件机制这一统一方法加以解决。
在我的应用中有两个需求:
1、左侧的List控件的itemrenderer中包含CheckBox控件,当其状态改变时需要同时改变主程序中的一个数组变量的内容;
2、左下方的“新增届次”按钮会弹出一个窗口,窗口中输入届次信息后需要修改数据库中的表,同时表的更改结果要能够在List控件中体现出来。
这两个需求我都通过事件机制来解决,具体方法如下:
第一个需求:
1、首先新建一个事件类:
import flash.events.Event;
public class ListItemChangeEvent extends Event{
public var Jieci:Object;//用来传递参数的类属性
public function ListItemChangeEvent(type:String, Jieci:Object=null,
bubbles:Boolean=false, cancelable:Boolean=false) {
this.Jieci=Jieci;
super(type, bubbles, cancelable);
}
}
}
2、List控件的代码如下:
<mx:List
id="JieciList" bottom="42" top="38" left="10" right="0"
dataProvider="{JieciListAC}"
labelFunction="ListLabelFunction">
<mx:itemRenderer>
<mx:Component>
<mx:CheckBox
change="onChange(event)">
<mx:Script>
<![CDATA[
import
com.RenDa.event.ListItemChangeEvent;
private
function onChange(evt:Event):void
{
var
JieciObj:Object=new
Object
JieciObj.jie=data.Jie
JieciObj.ci=data.Ci
//触发自定义事件,因为事件处理程序在主窗体中,所以evt的第三个参数即bubbles设置为TRUE,表示冒泡到主程序层
var
evtChange:ListItemChangeEvent=new
ListItemChangeEvent("List_Item_Changed",JieciObj,true);
this.dispatchEvent(evtChange);
}
]]>
</mx:Script>
</mx:CheckBox>
</mx:Component>
</mx:itemRenderer>
</mx:List>
3、主程序的初始化函数中定义时间侦听器:
JieciList.addEventListener("List_Item_Changed",ListItemChangeHandler);
}
4、主程序中定义事件处理函数:
//需要执行的代码放在这里
}
对于第二个需求,也是同样的原理,只不过主程序中侦听器的定义不是在程序初始化时,而是弹出窗口建立时,在子窗口关闭时触发事件,在主程序中侦听事件并作相应操作:
1、定义事件类:
package
com.RenDa.event{
import
flash.events.Event;
//子窗体关闭事件
public
class WindowCloseEvent extends
Event{
public
function WindowCloseEvent(type:String, bubbles:Boolean=false,
cancelable:Boolean=false){
super(type,
bubbles,
cancelable);
}
}
}
2、子窗体中在关闭子窗体之前触发事件:
this.dispatchEvent(evtClose);
PopUpManager.removePopUp(this)//关闭子窗体
3、主程序中定义事件侦听器:
private function
NewJieciBtnClickHandler(evt:MouseEvent):void{//弹出子窗按钮
var
popNewJieci:
NewJieciWin=NewJieciWin(PopUpManager.createPopUp(this,NewJieciWin,true));
//弹出对话框居中
PopUpManager.centerPopUp(popNewJieci);
//定义事件侦听器
popNewJieci.addEventListener("Sub_Window_Closed",NewJieciWinCloseHandler);
}
4、主程序中的事件处理函数:
private
function
NewJieciWinCloseHandler(evt:WindowCloseEvent):void{
//需要执行的代码放在这里
}
转载自: http://blog.sina.com.cn/s/blog_4d65c19e0100gwuv.html