Как я могу узнать, когда была нажата кнопка в itemRenderer Flex DataGrid?

У меня есть компонент DataGrid, который отображает несколько столбцов данных. В нем есть один дополнительный столбец, в котором отображается кнопка, позволяющая пользователю выполнить действие в отношении записи.

<mx:DataGrid dataProvider="{myData}">
    <mx:columns>
        <mx:DataGridColumn dataField="firstName" headerText="First Name" 
            width="75" />

        <mx:DataGridColumn dataField="LastName" headerText=" Last Name" 
            width="150" />

        <mx:DataGridColumn dataField="phone" headerText="Phone" 
            width="120" />

        <mx:DataGridColumn headerText="" width="110">
            <mx:itemRenderer>
                <mx:Component>
                    <mx:Box horizontalAlign="center" width="100%">
                        <mx:Button label="Take Action" />
                    </mx:Box>
                </mx:Component>
            </mx:itemRenderer>
        </mx:DataGridColumn>
    </mx:columns>
</mx:DataGrid>

Мне нужно выполнить действие в родительском компоненте, используя другие данные, которые доступны там, но не связаны с данными в DataGrid.

Как лучше всего поймать нажатие кнопки в родительском компоненте и узнать, какой записи он соответствует?

Должен ли я использовать Custom Event, или itemEditor, или что-то еще?


person Eric Belair    schedule 08.07.2009    source источник


Ответы (2)


Вам нужно сделать itemRenderer классом, а затем ссылаться на свой DataGrid из этого класса, используя методы, описанные здесь. Затем вы можете отправлять события из DataGrid, которые легко отслеживать в контейнере, который их хранит. Чего вы не хотите делать, так это полагаться на всплытие или пытаться напрямую прослушивать itemRenderer. Вероятно, вы захотите создать настраиваемое событие, которое несет свойство данных строки DataGrid, чтобы ваш прослушиватель событий мог быстро получить доступ к этой информации.

person Community    schedule 08.07.2009

Спасибо, Джоэл. Вот окончательное решение, которое я придумал после прочтения этой статьи (которую я читал раньше). Я хочу добавить элемент, кнопка которого была нажата, в массив, который является свойством другого элемента, поэтому я передаю «другой элемент» в компонент DataGrid как свойство и выполняю действия против него в вызове функции из itemRenderer:

/* CustomDataGrid.mxml */
<mx:DataGrid xmlns:mx="http://www.adobe.com/2006/mxml">
    <mx:Script>
        <![CDATA[
            public var otherData:Object;

            public function takeAction(item:Object):void
            {
                otherData["children"][0] = item;
            }
        ]]>
    </mx:Script>

    <mx:columns>
        <mx:DataGridColumn dataField="firstName" headerText="First Name" 
            width="75" />

        <mx:DataGridColumn dataField="LastName" headerText=" Last Name" 
            width="150" />

        <mx:DataGridColumn dataField="phone" headerText="Phone" 
            width="120" />

        <mx:DataGridColumn headerText="" width="110" 
            itemRender="ActionButtonItemRenderer" />
    </mx:columns>
</mx:DataGrid>

/* ActionButtonItemRenderer.as */
package
{
    import flash.events.MouseEvent;

    import mx.controls.Button;

    public class ActionButtonItemRenderer extends Button
    {
        public function ActionButtonItemRenderer()
        {
            super();

            label = "Take Action";
        }

        override protected function clickHandler(event:MouseEvent):void
        {
            super.clickHandler(event);

            var owner:CustomDataGrid = listData.owner as CustomDataGrid;

            owner.takeAction(data);
        }
    }
}
person Eric Belair    schedule 08.07.2009