Pergunta

Eu tenho um componente List que tem drop-in itemEditor CheckBox que também serve como o itemRenderer. Ele exibe cada item como um CheckBox simples com um rótulo.

No entanto, o evento itemEditEnd não se desencadeou até que eu clicar em algo fora da lista. Eu quero que ele desencadeou uma vez que a caixa de seleção está marcada ou desmarcada.

Eu estava pensando em despachar manualmente o ListEvent.ITEM_EDIT_END em um manipulador de eventos Click, mas, em seguida, o evento itemEditEnd iria ficar despachado duas vezes. Tem que haver uma maneira melhor de fazer isso.

Todas as idéias?

Graças.

Foi útil?

Solução

Aqui está a solução que eu vim com. Mudei minha lista para usar o componente como um itemRenderer única , não como um itemRenderer e itemEditor. Eu adicionei então um manipulador MouseEvent.CLICK para chamar uma função na Lista do itemRenderer para executar as ações necessárias:

Minha Lista de Componente:

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

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

Outras dicas

Acabei de correr para isso. Eu estou usando um componente personalizado em vez do drop-in abordagem, e isso funciona quando se utiliza o processador como o editor.

Note que as pessoas Flex evidentemente surgiu com a noção de que os usuários gostariam de alternar suas caixas de verificação algumas vezes antes de se decidir sobre o estado de se comprometer a ... em que ponto eles pressione a tecla Enter. Como óbvio!

A minha solução é sintetizar um evento de teclado que é equivalente a pressionar Enter. A parte complicada é que se deve usar o método callLater () para despachar o evento porque o controle de lista não vai ter registrado seu ouvinte teclado no editor até depois manipulador de clique da caixa de seleção é chamada. Aqui está a minha manipulador de clique para a caixa de seleção no meu costume componente renderizador / editor:

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)]); 
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top