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

但是,itemEditEnd事件不会被触发,直到我的东西单击列表之外。我想一旦该复选框被选中或取消选中它触发。

我在想的人工调度的Click事件处理ListEvent.ITEM_EDIT_END,但随后itemEditEnd事件会得到出动两次。有一定有更好的方法来做到这一点。

任何想法?

感谢。

有帮助吗?

解决方案

下面是我想出了该溶液。我改变了我的列表中使用的组件作为的itemRenderer的只有的,不作为的itemRenderer和itemEditor的。然后我添加了一个MouseEvent.CLICK处理程序调用在列表的函数从的itemRenderer以执行必要的操作:

我的列表组件:

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);
        }
    }
}

其他提示

我刚刚进入这个运行。我使用的是自定义组件,而不是投递的方式,而这种使用渲染器作为编辑器时的作品。

请注意Flex的人显然想出了一个概念,即用户将要解决对国家承诺......在这一点,他们会敲回车键切换前的复选框以几十倍。多么明显!

我的解决办法是,以合成一个键盘事件,它等效于按下回车键。最棘手的部分是一个必须使用使用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)]); 
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top