我有一个List
组件,该组件具有drop-in CheckBox
itemEditor,也可用作itemRenderer。它将每个项目显示为带有标签的简单CheckBox
。
但是,在我点击List之外的内容之前,itemEditEnd Event不会被触发。我希望在选中或取消选中CheckBox后触发它。
我在考虑在CLICK事件处理程序中手动调度ListEvent.ITEM_EDIT_END,但随后将调度itemEditEnd事件两次。必须有更好的方法来做到这一点。
有什么想法吗?
感谢。
答案 0 :(得分:2)
这是我提出的解决方案。我更改了我的列表以将组件用作itemRenderer 仅,而不是itemRenderer和itemEditor。然后我添加了一个MouseEvent.CLICK处理程序来从itemRenderer调用List中的函数来执行必要的操作:
我的列表组件:
package
{
import mx.controls.List;
import mx.core.ClassFactory;
public class CustomCheckBoxList extends List
{
public function CustomCheckBoxList()
{
super();
itemRenderer = new ClassFactory(CheckBoxRenderer);
}
public function dispatchSelectionEvent(item:Object, selected:Boolean):void
{
// Take action here...
}
}
}
我的ItemRenderer:
package
{
import flash.events.MouseEvent;
import mx.controls.CheckBox;
public class CheckBoxRenderer extends CheckBox
{
public function CheckBoxRenderer()
{
super();
}
override protected function clickHandler(event:MouseEvent):void
{
super.clickHandler(event);
CustomCheckBoxList(listData.owner).dispatchSelectionEvent(data, selected);
}
}
}
答案 1 :(得分:0)
我刚刚碰到这个。我使用自定义组件而不是插入方法,这在使用渲染器作为编辑器时起作用。
请注意,Flex人员显然提出了这样一种观念,即用户希望在确定要提交的状态之前将其复选框切换几次......此时他们会按Enter键。多么明显!
我的解决方案是合成键盘事件,相当于按Enter键。棘手的部分是必须使用callLater()方法来调度事件,因为在调用复选框的单击处理程序之后,列表控件才会在编辑器上注册其键盘侦听器。这是我的自定义渲染器/编辑器组件中的复选框的单击处理程序:
private function onClick(value:Object):void {
newValue = value;
var list:ListBase = ListBase(owner);
list.callLater(dispatchEvent, [new KeyboardEvent(KeyboardEvent.KEY_DOWN, true, false, Keyboard.ENTER, Keyboard.ENTER)]);
}