2009-10-19 3 views

Répondre

2

ai pas testé mais je suppose que quelque chose comme cela devrait fonctionner:

écouter événement dragStart sur les deux listes et définir une variable source selon event.target maintenant, écoutez l'événement dragDrop sur les deux. listes et appelez event.preventDefault() si le source est le même que le target

0

J'ai trouvé la solution, dont je ne suis pas sûr travaillerait pour quelqu'un d'autre. J'ai eu essentiellement dans mes deux listes: `

<mx:List id="srcList" dataProvider="{_source}" 
    allowMultipleSelection="true" 
    enabled="{enabled}" 
    labelField="{labelField}" 
    iconFunction="iconFunction" 
    dragEnabled="true" 
    dropEnabled="true" 
    dragDrop="doDragDrop(event);" 
    width="100%" 
    height="100%"  
    /> 
</mx:VBox> 
<mx:VBox paddingTop="50"> 
    <mx:Button label="-&gt;" enabled="{enabled}" click="add()"/> 
    <mx:Button label="&lt;-" enabled="{enabled}" click="rem()"/> 
</mx:VBox> 
<mx:VBox width="100%" height="100%"> 
    <mx:Label text="{right_col_heading}" /> 
    <mx:List id="dstList" dataProvider="{_destination}" 
     allowMultipleSelection="true" 
     enabled="{enabled}" 
     dragEnabled="true" 
     dropEnabled="true" 
     dragDrop="doDragDrop(event);" 
     width="100%" 
     height="100%" 
     labelField="{labelField}" 
     iconFunction="iconFunction" 
     verticalAlign="center" 
    />` 

I essentiellement ajouté un dragMoveEnabled = « true » pour les deux listes et maintenant en principe pas ajouter de nouveau à la même liste un élément lui-même, mais il suffit de déplacer l'ordre (ce qui n'a pas d'importance pour moi car c'est un envoi de savon et le back-logic le mettrait dans le bon ordre de toute façon).

2

Voici quelques fonctions simples que j'ai faites en construisant une application de travail que j'avais l'habitude d'enrouler ma tête autour de glisser glisser et laisser tomber. Je cherchais un moyen d'avoir plusieurs listes avec la fonctionnalité de glisser-déposer qui ne seraient pas interférer les uns avec les autres. En outre, je ne voulais pas faire de copie de données de liste autour.

private function onlyAllowMoveDragOverHandler(event:DragEvent):void { 
    event.preventDefault(); 
    event.currentTarget.showDropFeedback(event); 
    DragManager.showFeedback(DragManager.MOVE); 
} 

private function allowDropOnlyIfInitiatorEqualsComponent(event:DragEvent, component:IUIComponent):void { 
    event.preventDefault(); 
    if (event.dragInitiator == component) { 
    DragManager.acceptDragDrop(event.target as IUIComponent); 
    } 
    else { 
    DragManager.showFeedback(DragManager.NONE); 
    } 
} 

Et je utilisé dans mon MXML:

<mx:List 
    x="10" 
    y="170" 
    id="availableLangsList" 
    dataProvider="{availableLangs}" 
    width="100" 
    height="200" 
    dragEnabled="true" 
    dragMoveEnabled="true" 
    dropEnabled="true" 
    dragOver="onlyAllowMoveDragOverHandler(event);" 
    dragEnter="allowDropOnlyIfInitiatorEqualsComponent(event, selectedLangsList);" 
    dragComplete="selectedLangs.refresh();" 
    /> 

    <mx:Label x="129" y="153" text="list 4"/> 
    <mx:List 
    x="129" 
    y="170" 
    id="selectedLangsList" 
    dataProvider="{selectedLangs}" 
    width="100" 
    height="200" 
    dragEnabled="true" 
    dragMoveEnabled="true" 
    dropEnabled="true" 
    dragOver="onlyAllowMoveDragOverHandler(event);" 
    dragEnter="allowDropOnlyIfInitiatorEqualsComponent(event, availableLangsList);" 
    dragComplete="availableLangs.refresh();" 
    /> 
0

Dans mon cas, j'ai utilisé un HashCollection (qui étend ArrayCollection) [google juste, vous trouverez le composant]. Le fournisseur de données est lié à cette collection. Vous ajouteriez des éléments à la collection avec: dataprovider.put (clé, objet) au lieu de dataprovider.addItem (objet).

Le "hash" assurera l'unicité dans la collection. SO, même si l'utilisateur fait glisser-déposer quelque chose qui existe déjà dans le hachage, la valeur d'origine serait remplacée par le nouvel objet (mais cela n'aurait aucune importance car c'est la même valeur). La "clé", cependant, doit être unique .... sinon, l'idée de hachage ne fonctionnera pas.

0

Merci Brice, Ces fonctions ont été utiles. Pour qu'ils fonctionnent dans les listes d'étincelles, mettez simplement à jour la première fonction avec createDropIndicator au lieu de showDropFeedback et arrêtez de transmettre l'événement.

private function onlyAllowMoveDragOverHandlerS(event:DragEvent):void { 
    event.preventDefault(); 
    event.currentTarget.createDropIndicator(); 
    DragManager.showFeedback(DragManager.MOVE); 
} 
Questions connexes