单击“ItemRenderer”中的“复选框”时单击“事件触发”

时间:2012-03-08 23:33:10

标签: actionscript-3 flex

我有一个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>

1 个答案:

答案 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做某事时;从渲染器冒泡事件是我的首选方法。