2009-04-22 6 views
3

Ich habe eine Liste, die einen benutzerdefinierten ItemRenderer verwendet. Gibt es eine Möglichkeit für den Eigentümer (Liste), ein benutzerdefiniertes Ereignis, das ich erstellt habe, an alle Instanzen seines ItemRenderer zu senden?Flex AS3 - Dispatch-Ereignis an alle Instanzen von ItemRenderer

Zum Beispiel möchte ich ein Ereignis senden, das Text in ein Textfeld innerhalb des Elementrenderers hinzufügen wird. Ein oder mehrere Elementrenderer können abhängig von bestimmten Benutzerinteraktionen auf dieses Ereignis reagieren.

Gibt es einen Weg?

Thanks :)

Antwort

7

Wenn Ihre benutzerdefinierten ItemRenderer Instanzen Zugriff auf die List-Instanz haben irgendwie, es ist straigh vorwärts - registrieren Sie Ihre Event-Handling-Methode:

theList.addEventListener(YourCustomEvent.CUSTOM_EVENT, itemRendererCustomHander); 

Wenn Sie keinen direkten Zugriff haben (was ich annehme), du kannst es immer noch indirekt tun, zB durch einen Delegaten des Klassenobjekts des ItemRenderer. Machen Sie eine Instanz einer Unterklasse von Eventdispatcher eine statische Eigenschaft der ItemRenderer Klasse, und in Ihrem ItemRenderer Konstruktor, registrieren Sie einen Event-Handler mit ihm:

public class ItemRenderer { 
    public static var eventDelegate:YourCustomEventDispatcher; 

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

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

Wenn Sie jetzt theList (entweder in Actionscript oder in der initialize erstellen Ereignishandler Ihrer MXML-Komponente), erstellen Sie einen neuen YourCustomEventDispatcher, geben Sie ihm einen Verweis auf theList, und fügen Sie ihn dem ItemRenderer hinzu. YourCustomEventDispatcher registriert einen privaten Ereignishandler für YourCustomEvent mit theList und setzt ihn einfach erneut. Da alle ItemRenderer-Instanzen wiederum mit YourCustomEventDispatcher für YourCustomEvent registriert sind, erreicht das YourCustomEvent derLists alle ItemRenderer über einen Hop.

Dies ist im Grunde eine Implementierung des Observer Entwurfsmusters.

3

Um auf die List-Instanz zuzugreifen und den Ereignis-Listener hinzuzufügen, könnte der Renderer die IDropInListItemRenderer-Schnittstelle implementieren.

Sie werden dann gezwungen, die Methoden get listData und set listData zu implementieren, die von der Schnittstelle definiert werden. Diese Methode wird automatisch vom Framework aufgerufen, wenn Ihre Instanzen der Renderer-Klasse ein neues Element rendern müssen und das Set listData Ihnen ein BaseListData-Objekt mit nützlichen Informationen zur Verfügung stellt.

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

Beachten Sie, dass, wenn komplexere listenbasierten Komponenten (wie DataGrid-, Advanced und TreeList verwenden, könnten Sie werfen sicher das Base Objekt zu spezifischeren Klassen (Datagridlistdata, TreeListData, ...), um Zugriff auf eine Reihe anderer Informationen über den Kontext, in dem diese Elementrenderer-Instanz verwendet wird (z. B. welche Spalte des DataGrids gerendert wird)

+0

Schön, dies ist der direkte Zugriff, den ich bis dahin nicht kannte jetzt :-) Es ist sogar besser als meine obige Lösung, weil Sie mehrere Listen mit derselben ItemRenderer-Klasse haben können und nicht mehrere eventDelegates einrichten müssen. – Simon

+0

Genau :) Flex-Element-Renderer-Architektur ist ziemlich mächtig .. altuent Ich würde gerne wissen, welche Use Cases erfordern können Elementrenderer auf Ereignisse aus der Liste Komponente zu hören .. –