Flex AS3 - 将事件发送到ItemRenderer的所有实例

时间:2009-04-22 11:20:47

标签: flex actionscript-3 events

我有一个使用自定义ItemRenderer的List。有没有办法让所有者(List)将我创建的自定义事件分派给它的所有ItemRenderer实例?

例如,我想调度一个事件,该事件将文本添加到项呈示器中的文本框中。一个或多个项目渲染器将能够根据某些用户交互响应此事件。

有办法吗?

谢谢:)

2 个答案:

答案 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的哪一列)。