2009-04-22 7 views
3

J'ai une liste qui utilise un ItemRenderer personnalisé. Y a-t-il un moyen pour le propriétaire (List) d'envoyer un événement personnalisé que j'ai créé, à toutes les instances de son ItemRenderer? Par exemple, je souhaite distribuer un événement qui ajoutera du texte à une zone de texte dans le rendu d'élément. Un ou plusieurs éléments de rendu seront capables de répondre à cet événement en fonction de certaines interactions de l'utilisateur.Flex AS3 - Dispatch Event à toutes les instances de ItemRenderer

Y a-t-il un moyen?

Merci :)

Répondre

7

Si vos instances ItemRenderer personnalisés ont accès à l'instance de la liste en quelque sorte, il est straigh avant - juste enregistrer votre méthode de gestion des événements:

theList.addEventListener(YourCustomEvent.CUSTOM_EVENT, itemRendererCustomHander); 

Si vous n'avez pas accès direct (ce que je suppose), vous pouvez toujours le faire indirectement, par exemple via un délégué de l'objet de classe ItemRenderer. Faire une instance d'une sous-classe de EventDispatcher une Propriété statique de la classe ItemRenderer, et dans votre ItemRenderer constructeur, inscrivez-vous un gestionnaire d'événements avec elle:

public class ItemRenderer { 
    public static var eventDelegate:YourCustomEventDispatcher; 

    public function ItemRenderer() { 
     eventDelegate.addEventListener(YourCustomEvent.CUSTOM_EVENT, itemRendererCustomHander); 
     (...) 
    } 

    public function itemRendererCustomHander(event:YourCustomEvent) { 
     (...) 
    } 
} 

Maintenant, lorsque vous créez theList (dans ActionScript ou dans le initialize gestionnaire d'événements de votre composant MXML), créez un nouveau YourCustomEventDispatcher, donnez-lui une référence à theList et ajoutez-le à ItemRenderer. YourCustomEventDispatcher enregistre un gestionnaire d'événement privé pour YourCustomEvent avec theList, et le redispose simplement. Comme toutes les instances ItemRenderer sont à leur tour enregistrées pour YourCustomEvent avec YourCustomEventDispatcher, YourCustomEvent de theLists atteint tous les ItemRenderers via un seul saut.

Il s'agit essentiellement d'une implémentation du modèle de conception Observer.

3

Pour accéder à l'instance List et ajouter l'écouteur d'événement, votre moteur de rendu peut implémenter l'interface IDropInListItemRenderer.

Vous serez ensuite obligé d'implémenter les méthodes get listData et set listData définies par l'interface. Cette méthode sera appelée automatiquement par le framework lorsque vos instances de la classe de rendu seront nécessaires pour rendre un nouvel élément, et l'ensemble listData vous fournira un objet BaseListData avec quelques informations utiles.

public function set listData(listData:BaseListData):void { 
    var list:UIComponent = listData.owner; // the list component instance 
    list.addEventListener(YourCustomEvent.CUSTOM_EVENT, itemRendererCustomHander); 
} 

Notez que, lors de l'utilisation des composants à base de liste plus complexes (tels que DataGrid, AdvancedDataGrid et liste arborescente, vous pourriez en toute sécurité jeter l'objet BaseListData à des classes plus spécifiques (DataGridListData, TreeListData, ...) afin de accéder à un ensemble d'autres informations sur le contexte dans lequel cette instance de rendu d'élément est utilisée (par exemple, quelle colonne du DataGrid il va rendre)

+0

Nice, c'est l'accès direct que je ne savais pas avant maintenant :-) C'est encore mieux que ma solution ci-dessus parce que vous pouvez avoir plusieurs listes avec la même classe ItemRenderer et n'avez pas besoin de configurer plusieurs eventDelegates. – Simon

+0

Exactement :) L'architecture des moteurs de rendu Flex est assez puissante .. Je voudrais savoir quels cas d'utilisation pourraient nécessiter un rendu d'élément pour écouter les événements du composant liste. –

Questions connexes