2009-05-06 7 views
0

J'ai un projet Flex3 avec 2 contrôles HorizontalList; l'un d'eux a traîné & drop activé. Les deux contrôles auront toujours le même nombre d'éléments, et sont liés ... l'index 0 du 1er contrôle correspond à l'index 0 du 2ème contrôle, et ainsi de suite.Commande par glisser-déposer flexible d'un contrôle HorizontalList - Recherche d'index FROM et TO?

Naturellement, lorsque vous utilisez le glisser-déposer pour réorganiser le 2e contrôle, je veux que les éléments du 1er contrôle reflètent le même réordonnancement. Je pense que je peux gérer la mise à jour réelle du contrôle, mais j'ai du mal à trouver le de et à index de l'article qui a été déplacé par glisser & déposer.

En utilisant la méthode dragDrop sur le contrôle qui permet le glisser-déposer, et lisant attentivement le contenu de event.currentTarget (au lieu de event.targetbecause the docs say so) dans le débogueur montre une propriété publique nommée selectedIndex qui ne semble tenir la de l'indice, mais Je ne vois aucune propriété qui me dira l'index à.

Est-ce que je donne sur la propriété? Dois-je en déduire en fonction d'autre chose? Y a-t-il une meilleure manière de faire cela?

mise à jour: Une solution acceptable peut également être d'itérer sur le contenu de HorizontalList et d'enregistrer la valeur d'index interne dans un tableau qui pourrait ensuite être utilisé pour trier à nouveau le dataProvider pour l'autre liste; mais je n'arrive pas à comprendre comment parcourir le contenu de la liste, donc je suis juste coincé. Toute aide là-bas?

Voici mon code:

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> 

Le Alert.show(...) est pas là pour montrer quelque chose d'utile, je l'ai mis un point d'arrêt sur cette ligne afin que je puisse inspecter l'argument de l'événement.

Je ne pense pas que les itemsRenderer personnalisés soient importants (il n'y a pas encore beaucoup de code), donc je les laisserai pour des raisons de concision. Si vous pensez qu'ils sont sont important, faites le moi savoir et je vais les éditer ici.

Répondre

2

Il s'avère que la solution consistait à passer de l'utilisation de l'événement dragDrop à l'événement dragComplete; À quel point, le dataProvider lié a été mis à jour pour refléter le réordonnancement.

-1

Cest pourquoi le modèle Model Locator est fait pour!

Vous devez déplacer votre fournisseur de données vers une classe singleton (modèle par exemple) que vos rendus d'éléments peuvent facilement y accéder. Il n'y a aucun point que votre article a l'index de propriété puisqu'il est déjà donné par un [ArrayCollection] .getItemIndex (..)