我有一个使用自定义ItemRenderer的List。有没有办法让所有者(List)将我创建的自定义事件分派给它的所有ItemRenderer实例?
例如,我想调度一个事件,该事件将文本添加到项呈示器中的文本框中。一个或多个项目渲染器将能够根据某些用户交互响应此事件。
有办法吗?
谢谢:)
答案 0 :(得分:7)
如果您的自定义ItemRenderer实例可以以某种方式访问List实例,那么它就是直接前进 - 只需注册您的事件处理方法:
theList.addEventListener(YourCustomEvent.CUSTOM_EVENT, itemRendererCustomHander);
如果您没有直接访问权限(我假设),您仍然可以间接访问,例如通过ItemRenderer的类对象的委托。使EventDispatcher的子类的实例成为ItemRenderer类的静态属性,并在ItemRenderer构造函数中,使用它注册事件处理程序:
public class ItemRenderer {
public static var eventDelegate:YourCustomEventDispatcher;
public function ItemRenderer() {
eventDelegate.addEventListener(YourCustomEvent.CUSTOM_EVENT, itemRendererCustomHander);
(...)
}
public function itemRendererCustomHander(event:YourCustomEvent) {
(...)
}
}
现在,当您创建List(在ActionScript中或在MXML组件的initialize事件处理程序中)时,创建一个新的YourCustomEventDispatcher,为其提供对List的引用,并将其添加到ItemRenderer。 YourCustomEventDispatcher使用List为YourCustomEvent注册一个私有事件处理程序,并只重新调整它。由于所有ItemRenderer实例都使用YourCustomEventDispatcher注册了YourCustomEvent,因此列表的YourCustomEvent通过一跳到达所有ItemRenderer。
这基本上是Observer设计模式的实现。
答案 1 :(得分:3)
要访问List实例并添加事件侦听器,渲染器可以实现IDropInListItemRenderer接口。
然后,您将被迫实现get listData并设置接口定义的listData方法。当渲染器项的实例需要渲染新项时,框架将自动调用此方法,set listData将为您提供包含一些有用信息的BaseListData对象。
public function set listData(listData:BaseListData):void {
var list:UIComponent = listData.owner; // the list component instance
list.addEventListener(YourCustomEvent.CUSTOM_EVENT, itemRendererCustomHander);
}
请注意,当使用更复杂的基于列表的组件(例如DataGrid,AdvancedDataGrid和TreeList)时,您可以安全地将BaseListData对象强制转换为更具体的类(DataGridListData,TreeListData,...)以访问一组有关正在使用此项呈示器实例的上下文的其他信息(例如,它将要呈现的DataGrid的哪一列)。