arraste Flex e reordenar queda de um controle HorizontalList - Finding FROM e índices para?
-
06-07-2019 - |
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.
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 (..)