arraste Flex e reordenar queda de um controle HorizontalList - Finding FROM e índices para?

StackOverflow https://stackoverflow.com/questions/831482

Pergunta

Eu tenho um projeto Flex3 com 2 controles HorizontalList; um dos quais tem drag & drop habilitado. Ambos os controles sempre terá o mesmo número de itens, e são relacionados ... índice 0 do 1º controle corresponde índice 0 do 2º controle, e assim por diante.

Naturalmente, quando usando arrastar e soltar para reordenar o 2º controle, eu quero os itens na 1ª controle para refletir o mesmo reordenamento. Eu acho que posso lidar com a atualização real do controle, mas eu estou tendo problemas para encontrar o e para índices do item que tenha sido movido via drag & drop.

Usando o método dragDrop no controle que permite arrastar e soltar, e examinando os conteúdos de event.currentTarget (em vez de event.target porque os docs dizer isso ) nos shows depurador uma propriedade pública denominada selectedIndex que parece segurar o index , mas eu não vejo quaisquer propriedades que vai me dizer o para índice.

Am I com vista para a propriedade? Eu tenho que inferir-lo com base em outra coisa? Existe uma maneira melhor de fazer isso?

atualização: Uma solução aceitável também poderia ser a iteração sobre o conteúdo do HorizontalList e salvar o valor do índice interno para uma matriz que pode então ser usada para re-tipo do dataProvider para a outra lista ; mas eu não consigo descobrir como iterar sobre o conteúdo da lista, por isso estou tão preso. Qualquer ajuda lá?

Aqui está o meu código:

main.mxml:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application 
    xmlns:mx="http://www.adobe.com/2006/mxml" 
    xmlns:com="components.*"
    layout="absolute" 
>
    <mx:Script>
        <![CDATA[
            import mx.events.DragEvent;
            import mx.controls.Alert;
            import mx.collections.ArrayCollection;

            //these two variables are junk data to represent 
            //what we will get back from our data services...
            [Bindable] 
            private var btnData:ArrayCollection = new ArrayCollection(
                [
                    {title:'title1', index:0},
                    {title:'title2', index:1},
                    {title:'title3', index:2},
                    {title:'title4', index:3}
                ]
            );
            [Bindable] 
            private var chainData:ArrayCollection = new ArrayCollection(
                [
                    {tmp:'testing 1'},
                    {tmp:'testing 2'},
                    {tmp:'testing 3'},
                    {tmp:'testing 4'}
                ]
            );

            //handle button re-ordering
            private function handleBtnReorder(event:DragEvent):void{
                Alert.show(event.action.toString());
            }
        ]]>
    </mx:Script>

    <mx:HorizontalList
        id="ChainView"
        dataProvider="{chainData}"
        itemRenderer="components.ItemRenderers.ChainLinkRenderer"
        left="20"
        right="20"
        top="20"
        height="300"
        rowHeight="300"
        columnWidth="500"
        rollOverColor="#ffffff"
        selectionColor="#eeeeee"
    />

    <mx:HorizontalList 
        id="btnList" 
        dataProvider="{btnData}"
        dragEnabled="true" 
        dropEnabled="true"
        dragMoveEnabled="true"
        dragDrop="handleBtnReorder(event)"
        itemRenderer="components.ItemRenderers.BtnListRenderer"
        horizontalCenter="true"
        left="20"
        right="20"
        top="320"
        height="50"
        rowHeight="35"
        rollOverColor="#ffffff"
        selectionColor="#ffffff"
    />

</mx:Application>

O Alert.show(...) não está lá para mostrar alguma coisa útil, eu configurei um ponto de interrupção na linha para que eu possa inspecionar o argumento de evento.

Eu não acho que as do itemRenderer personalizado são importantes (não há muito código para eles, até o momento), por isso vou deixá-los fora por razões de brevidade. Se você acha que eles são importante, deixe-me saber e eu vou editá-los aqui.

Foi útil?

Solução

Acontece que a solução era mudar de usar o evento dragDrop ao evento dragComplete; em que ponto, o dataProvider binded foi atualizado para refletir a reordenação.

Outras dicas

É por isso que o padrão Model Locator é feita para!

Você deve mover o seu dataProvider a uma classe Singleton (Modelo por exemplo) do que seus representantes de itens pode facilmente acesso a ele. Não há nenhum ponto que o item tem a propriedade Index desde a sua já dado por um [ArrayCollection] .getItemIndex (..)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top