我有一个itemRenderer自定义组件内联我的DataGrid组件。当选中或取消选中复选框时(在itemRenderer组件中),我需要在包含类(与DataGrid处于同一级别)中触发事件。我该怎么做?
<mx:DataGrid id="dg" width="100%" dataProvider="{dgProvider}" editable="true" itemClick="dg_itemClickHandler(event)">
<mx:columns>
<mx:DataGridColumn dataField="selected" width="100" headerText="Include:" textAlign="center" editable="true" editorDataField="cbSelected" rendererIsEditor="true">
<mx:itemRenderer>
<mx:Component>
<!-- We need this canvas because it centers the checkbox: -->
<mx:Canvas width="100" textAlign="center">
<mx:Script>
<![CDATA[
// Define a property for returning
// the new value to the cell.
[Bindable]
public var cbSelected:Boolean;
protected function selectedCheckbox_clickHandler(event:MouseEvent):void
{
cbSelected = selectedCheckbox.selected;
}
]]>
</mx:Script>
<mx:CheckBox
id="selectedCheckbox"
selected="{data.selected}"
horizontalCenter="0"
click="selectedCheckbox_clickHandler(event)" />
</mx:Canvas>
</mx:Component>
</mx:itemRenderer>
</mx:DataGridColumn>
</mx:columns>
答案 0 :(得分:1)
这里有一些事情......第一个是你要求的,第二个是我认为你真正需要的。
首先,当你说“包含类”时,我假设你引用了DataGrid的父类。这与itemRenderer的父级非常不同。要让DataGrid的父级从itemRenderer的代码中调度一个事件,我会使用outerDocument。
protected function selectedCheckbox_clickHandler(event:MouseEvent):void
{
cbSelected = selectedCheckbox.selected;
outerDocument.dispatchEvent(new Event('myEvent'));
}
我不喜欢outerDocument的用户,因为它破坏了封装。
但是,我怀疑你需要在父节点中有一个监听器,如果父节点触发事件也无关紧要。在这种情况下,您可以使用事件的Bubble属性创建一个冒泡的事件:
protected function selectedCheckbox_clickHandler(event:MouseEvent):void
{
cbSelected = selectedCheckbox.selected;
outerDocument.dispatchEvent(new Event('myEvent',true));
}
您可以在层次结构链中的任何组件上一直监听事件,直到主应用程序。这包括您的DataGrid和您的DataGrid的父容器。该事件不会出现在MXML代码提示中,但您可以使用addEventListener方法添加eventListeners:
dataGrid.addEventListener('myEvent',myEventListener);
当你需要告诉父母从itemRenderer做某事时;从渲染器冒泡事件是我的首选方法。