我有一个带有自定义 ItemRenderer 的列表。ItemRenderer 包含一个复选框和一个标签。带有列表的组件有一个“全选”复选框。当“全选”复选框被选中时,它会调度一个事件,每个项目都应该监听以选择自己的复选框。EventListener将在每个项目的CreationComplete上添加,并且选择“选择”复选框时正确派出了该事件,但是自定义ItemRenderer中的侦听器不收听。
如何让 ItemRenderer 监听在其父级中调度的事件?
我将添加一些代码示例来澄清:
------- container ----------
<mx:VBox>
<mx:Script>
<![CDATA[
public var user1 = new User(1, "Jack");
public var user2 = new User(2, "John");
public var user3 = new User(3, "Mary");
[Bindable]
public var users:ArrayCollection = new ArrayCollection([user1], [user2], [user3]);
public static const SELECT_ALL_USERS:String = "selectAllUsers";
private function selectAllChangeHandler():void
{
if (selectAll.selected)
dispatchEvent(new Event(SELECT_ALL_USERS,true));
}
]]>
</mx:Script>
<mx:CheckBox id="selectAll" change="{selectAllChangeHandler()}" />
<mx:List dataProvider="{users}" itemRenderer="myRenderer" />
</mx:VBox>
------- renderer ----------
<?xml version="1.0" encoding="utf-8"?>
<mx:HBox creationComplete="{init()}">
<mx:Script>
<![CDATA[
private function init():void
{
addEventListener (Container.SELECT_ALL, selectAllHandler, false, 0, true);
}
private function selectAllHandler():void
{
checkbox.selected=true;
}
private function selected(id:int):Boolean
{
return id==1 || id==3;
}
]]>
</mx:Script>
<mx:CheckBox id="checkbox" selected="{selected(data.id)}" />
<mx:Label text="{data.name}" />
</mx:HBox>
请注意,用户 ArrayCollection 或其包含的用户对象无法更改,因为我稍后需要这些值。因此,当单击“selectAll”时,还应选中列表中的每个复选框。