Нажмите Event Fire, когда установлен флажок в ItemRenderer - PullRequest
0 голосов
/ 09 марта 2012

У меня есть встроенный компонент itemRenderer моего компонента DataGrid.Мне нужно, чтобы событие срабатывало в содержащем классе (на том же уровне, что и DataGrid), когда флажок установлен или снят (в компоненте itemRenderer).Как бы я это сделал?

<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 Ответ

1 голос
/ 09 марта 2012

Здесь есть несколько вещей ... во-первых, это то, что вы просили, а во-вторых, то, что, я думаю, вам действительно нужно.

Во-первых, когда вы говорите «Содержащий класс», я предполагаю, что вы ссылаетесь на родителя DataGrid. Это очень отличается от родителя itemRenderer. Чтобы родительский объект DataGrid отправлял событие из кода itemRenderer, я бы использовал outerDocument .

protected function selectedCheckbox_clickHandler(event:MouseEvent):void
{
  cbSelected = selectedCheckbox.selected;
  outerDocument.dispatchEvent(new Event('myEvent'));
}

Мне не нравится пользователь externalDocument, потому что он нарушает инкапсуляцию.

Однако я подозреваю, что у вас должен быть прослушиватель в родительском элементе, и не имеет значения, запускает ли родитель событие или нет. В этом случае вы можете просто создать событие, которое всплывает, используя свойство Bubble вашего события:

protected function selectedCheckbox_clickHandler(event:MouseEvent):void
{
  cbSelected = selectedCheckbox.selected;
  outerDocument.dispatchEvent(new Event('myEvent',true));
}

Вы можете прослушивать событие в любом компоненте в иерархической цепочке вплоть до основного Приложения. Это включает в себя вашу DataGrid и родительский контейнер вашей DataGrid. Событие не будет отображаться в подсказке кода MXML, но вы можете добавить eventListener, используя метод addEventListener:

dataGrid.addEventListener('myEvent',myEventListener);

Когда вам нужно сказать родителю сделать что-то из itemRenderer; Мой подход - это всплывающее событие от средства визуализации.

...