Apache flex Flex AS3-将事件分派到ItemRenderer的所有实例

Apache flex Flex AS3-将事件分派到ItemRenderer的所有实例,apache-flex,actionscript-3,events,Apache Flex,Actionscript 3,Events,我有一个使用自定义ItemRenderer的列表。所有者(列表)是否有办法将我创建的自定义事件分派到其ItemRenderer的所有实例 例如,我想调度一个事件,将文本添加到项目渲染器中的文本框中。根据特定的用户交互,一个或多个项目呈现器将能够响应此事件 有办法吗 谢谢:)如果您的自定义ItemRenderer实例以某种方式可以访问列表实例,那么它是向前的-只需注册您的事件处理方法: theList.addEventListener(YourCustomEvent.CUSTOM_EVENT, i

我有一个使用自定义ItemRenderer的列表。所有者(列表)是否有办法将我创建的自定义事件分派到其ItemRenderer的所有实例

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

有办法吗


谢谢:)

如果您的自定义ItemRenderer实例以某种方式可以访问列表实例,那么它是向前的-只需注册您的事件处理方法:

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) {
        (...)
    }
}
现在,当您创建列表时(在ActionScript或MXML组件的初始化事件处理程序中),创建一个新的YourCustomEventDispatcher,给它一个对列表的引用,并将其添加到ItemRenderer。CustomEventDispatcher在列表中注册CustomEvent的私有事件处理程序,然后重新对其进行修补。由于所有ItemRenderer实例依次向CustomEventDispatcher注册了YourCustomEvent,列表中的YourCustomEvent通过一个跃点到达所有ItemRenderer


这基本上是Observer设计模式的实现。

要访问列表实例并添加事件侦听器,渲染器可以实现IDropInListItemRenderer接口

然后,您将被迫实现由接口定义的get-listData和set-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的哪一列)。

Nice,这是我到目前为止还不知道的直接访问方法:-)它甚至比我上面的解决方案更好,因为您可以使用相同的ItemRenderer类拥有多个列表,并且不需要设置多个EventDelegate。确切地说:)Flex项目渲染器架构非常强大。。虽然我想知道哪些用例可能需要项呈现器侦听列表组件中的事件。。