2013-05-10 4 views
0

У меня есть DataGrid, а в ячейках первого столбца есть itemRenderer с изображенным рисунком и событием doubleClick.Получить selectedIndex в Datagrid от itemRenderer

Итак, когда происходит событие двойного щелчка, этот рендерер поймает событие и обработчик. Вопрос в том, что я хотел бы отправить событие с индексом выбранного элемента в Datagrid, и я не знаю, как это сделать.

s:GridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:s="library://ns.adobe.com/flex/spark" 
       xmlns:mx="library://ns.adobe.com/flex/mx" clipAndEnableScrolling="true" 
       width="50" height="30"> 

<fx:Script> 
    <![CDATA[ 
     import events.EditItemEvent; 

     import mx.controls.Alert; 
     override public function prepare(hasBeenRecycled:Boolean):void {} 

     protected function btn_edit_doubleClickHandler(event:MouseEvent):void { 
      /* here I dispatchEvent with the 'index' of the selectedItem of the datagrid */ 
     } 

    ]]> 
</fx:Script> 
<s:Image id="btn_edit" horizontalCenter="0" source="@Embed('assets/images/edit_icon.png')" 
     verticalCenter="0" 
     doubleClickEnabled="true" 
     doubleClick="btn_edit_doubleClickHandler(event)"/> 

Любая идея?

ответ

1

Вы можете использовать grid. selectedIndex?

Честно говоря, я думаю, что это плохая идея. Средство визуализации ничего не должно знать о DataGrid, включая selectIndex. Если вы хотите отправить настраиваемое событие, чтобы вы могли работать с данными рендеринга в каком-либо месте в иерархии списка отображения; вы должны включить данные, а не индекс. Данные вашего обработчика работают с данными.

+0

Не могли бы вы привести пример? – Apalabrados

+0

У меня нет времени сделать подробный пример. Начните с чтения документации Flex по событиям: http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf69084-7ee9.html и попытайтесь заставить ее работать, а затем вернитесь с конкретным вопросом. – JeffryHouser

0

вы можете получить доступ к нему через его владелец недвижимости:

(this.owner as DataGrid).selectedIndex 

простой ItemRenderer, которая отправляет пользовательское событие:

<s:GridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
      xmlns:s="library://ns.adobe.com/flex/spark" 
      xmlns:mx="library://ns.adobe.com/flex/mx"> 

<fx:Script> 
    <![CDATA[ 

     override public function prepare(hasBeenRecycled:Boolean):void { 
      lblData.text = data[column.dataField] 
     } 
     protected function onClickButton(ev:MouseEvent):void { 
      trace("ButtonDispatchItemRenderer::onClickButton"); 
      //dispatch the Event which has a static const GET_SELECTED_INDEX for the event type 
      this.owner.dispatchEvent(new MyEvent(MyEvent.GET_SELECTED_INDEX)); 
     } 
    ]]> 
</fx:Script> 

<s:HGroup verticalAlign="baseline"> 
    <s:Label id="lblData" top="9" left="7"/> 
    <s:Button label="dispatch" click="onClickButton(event)"/> 
</s:HGroup> 

</s:GridItemRenderer> 

простой приложение с DataGrid прослушивания события

<mx:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
      xmlns:s="library://ns.adobe.com/flex/spark" 
      xmlns:mx="library://ns.adobe.com/flex/mx" 
      minWidth="955" minHeight="600" creationComplete="onCreationComplete()"> 
<fx:Declarations> 
    <!-- Place non-visual elements (e.g., services, value objects) here --> 
</fx:Declarations> 
<fx:Script> 
    <![CDATA[ 
     import mx.collections.ArrayCollection; 

     import spark.components.gridClasses.GridColumn; 


     [Bindable] 
     public static var initDG:ArrayCollection = new ArrayCollection([ 
      {label:"firstItem"}, {label:"secondItem"}, {label:"thirdItem"} 

     ]); 


     protected function onCreationComplete():void { 

      dataGrid.addEventListener(MyEvent.GET_SELECTED_INDEX, onRendererButtonClick, false, 0, true); 
     } 
     protected function onRendererButtonClick(ev:MyEvent):void { 
      trace("Application::RenderButtonClick"); 
     } 

    ]]> 

</fx:Script> 
<s:VGroup> 
    <s:DataGrid id="dataGrid" verticalCenter="0" horizontalCenter="0" dataProvider="{initDG}"> 
     <s:columns> 
      <s:ArrayList> 
       <s:GridColumn dataField="label" itemRenderer="renderers.ButtonDispatchItemRenderer"></s:GridColumn>     
      </s:ArrayList> 
     </s:columns>    
    </s:DataGrid> 
</s:VGroup> 

</mx:Application> 

вы должны добавить свойство к вашему событию, которое содержит selectedIndex , И вы должны передать значение событию внутри средства визуализации (например, второй аргумент в конструкторе). Этот пример просто отправляет событие

+0

Привет @michaPohh, я только что внедрил ваш код, и он не работает. \t \t \t \t Вызов this.owner.dispatchEvent (новый EditItemEvent (EditItemEvent.EDIT_CLICKED)); --------- Приемник: \t \t \t \t preciosGrid.addEventListener (EditItemEvent.EDIT_CLICKED, showMessage, false, 0, true); – Apalabrados

+0

Разве rowIndex не связано с количеством строк, отображаемых на экране? Я не думаю, что это коррелирует с индексом данных визуализатора в dataProvider. – JeffryHouser

+0

Я имею в виду, что слушатель не получает Событие. У меня есть только Alert, когда функция вызывается через Listener. – Apalabrados