Lanzar eventos desde un itemrenderer y recogerlos desde la lista en flex4

Soy un noob en Flex y por eso llevo varias horas simplemente intentando mostrar un componente en el momento que se dispara un evento en un itemrenderer de una lista.

El caso es el siguiente. Mi aplicación tiene una lista en la que cargo un itemrenderer en otro componente al que llamo “repeatedItem” y tiene anidados otros componentes. Además de la lista tengo otro componente personalizado que se inicia oculto al que llamaré “customComponent”. La objetivo es modificar customComponent en el momento que el cursor se posiciona sobre uno de los componentes que forman parte del itemrenderer, una imagen en concreto con id=cover.

El encapsulamiento de los objetos no permite acceder directamente a customComponent desde el itemrenderer así que despues de probar varias cosas he encontrado una solución. Se trata de utilizar dispatchEvent para lanzar un Evento custom y recogerlo desde un listener creado cuando la lista se crea.

repeatedItem.mxml

[code]
<mx:Image source=”{data.cover}” id=”imageCover” mouseOver=”imageCover_mouseOverHandler(event)”/>
[/code]

Creo el evento mouse over

repeatedItem.mxml

[code]
protected function list_creationCompleteHandler(event:FlexEvent):void {
list.addEventListener(components.RepeatedItem2.coverOver, coverOverHandler);
//resto de código
}

protected function coverOverHandler(e:Event):void {
customcomponent.visible = true;
}
[/code]

Y el handler se ecarga de crear y lanzar nuestro evento custom que recogeremos desde un nivel superior.

Main.mxml

[code]
<s:List skinClass=”components.DataList1″ id=”list”creationComplete=”list_creationCompleteHandler(event)” dataProvider=”{TypeUtility.convertToCollection(getMoviesPageResult.lastResult.movies)}”updateComplete=”list_updateComplete_Handler()”>
</s:List>
<components:customComponent  id=”customcomponent” visible.original=”false”/>
[/code]
Crear listener cuando se lanza el evento updateComplete es perfecto para ponerse a escuchar nada mas crearse la lista.

Main.mxml

[code]
protected function list_creationCompleteHandler(event:FlexEvent):void {
list.addEventListener(components.RepeatedItem2.coverOver, coverOverHandler);
//resto de código
}

protected function coverOverHandler(e:Event):void {
customcomponent.visible = true;
}
[/code]
Añado el listener del evento custom al component con id=list y creo la función que se ejecutará cuando ocurra.

Y ya está. Hay otras soluciones si usas flex 2 o 3, pero esta es la que a mi me ha funcionado usando la versión 4.

Links:
http://www.leavethatthingalone.com/blog/index.cfm/2008/9/15/ExampleofFea…
http://help.adobe.com/en_US/Flex/4.0/UsingSDK/WS2db454920e96a9e51e63e3d1…
http://nwebb.co.uk/blog/?p=16