2

我有一个List组件,它具有CheckBox也用作 itemRenderer 的插入式 itemEditor。它将每个项目显示为CheckBox带有标签的简单项目。

但是,在我单击列表之外的内容之前,不会触发 itemEditEnd 事件。我希望它在 CheckBox 被选中或未选中时触发。

我正在考虑在 CLICK 事件处理程序中手动分派 ListEvent.ITEM_EDIT_END,但随后 itemEditEnd 事件将被分派两次。必须有更好的方法来做到这一点。

有任何想法吗?

谢谢。

4

2 回答 2

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...
        }
    }
}

我的项目渲染器:

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);
        }
    }
}
于 2009-07-15T21:15:37.840 回答
0

我刚遇到这个。我使用的是自定义组件而不是插入式方法,这在使用渲染器作为编辑器时有效。

请注意,Flex 人员显然提出了这样一个概念,即用户希望在确定要提交的状态之前切换他们的复选框几次......此时他们会按下 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)]); 
}
于 2009-12-02T05:22:59.370 回答