【问题标题】:How can I trigger an itemEditEnd Event in a Flex List when the CheckBox is checked/unchecked?选中/取消选中 CheckBox 时,如何在 Flex 列表中触发 itemEditEnd 事件?
【发布时间】:2009-06-30 16:37:09
【问题描述】:

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

但是,直到我单击列表之外的内容时才会触发 itemEditEnd 事件。我希望它在 CheckBox 被选中或取消选中时触发。

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

有什么想法吗?

谢谢。

【问题讨论】:

  • 从逻辑上讲,复选框界面是这样的,单击它并不代表编辑结束 - 您可以改变主意并再次单击它,切换表示的布尔值。编辑的结束应该(理想情况下)在某种程度上与开始编辑的操作对称 - 只是单击列表中的复选框吗?

标签: apache-flex actionscript-3 list checkbox itemeditor


【解决方案1】:

这是我想出的解决方案。我更改了我的列表以将组件用作 itemRendereronly,而不是 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);
        }
    }
}

【讨论】:

    【解决方案2】:

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

    请注意,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)]); 
    }
    

    【讨论】:

      猜你喜欢
      • 2011-03-28
      • 1970-01-01
      • 1970-01-01
      • 2011-04-18
      • 2015-06-16
      • 1970-01-01
      • 1970-01-01
      • 2014-04-09
      • 2017-06-11
      相关资源
      最近更新 更多