2009-10-19 68 views
1

我有Flex的問題。我想知道,如果我有兩個列表框,並且我想在它們之間拖放,我如何防止用戶拖動到同一個列表中(從而複製項目?)我不能有這種情況案例謝謝你們Flex ::我如何防止拖放,拖到自我

回答

2

沒有測試過,但我想這樣的事情應該工作:

聽兩個名單dragStart事件並設置source變量取決於event.target現在聽上都dragDrop事件。如果sourcetarget相同,則列出並呼叫event.preventDefault()

0

我找到了解決方案,我不知道該如何解決其他人的問題。我基本上在我的兩個列表: `

<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" 
    />` 

我基本上都添加了一個dragMoveEnabled =「true」以兩個列表現在基本上不重新添加到同一列表中的項目本身,而只是移動的順序(這對我來說並不重要,因爲它發送的是肥皂,反向邏輯反正會按照正確的順序)。

2

這裏有一些簡單的功能,我建立了一個工作應用程序,我用頭圍繞着flex拖放來包裹頭部。我一直在尋找一種方法來使用拖放功能的多個列表,這些列表不會互相干擾。另外,我不想處理複製清單數據。

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

而且我在我的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

在我的情況,我用了一個HashCollection(延伸的ArrayCollection)它只是谷歌,你會發現該組件。數據提供者綁定到這個擁有集合。您可以使用:dataprovider.put(key,object)而不是dataprovider.addItem(object)將項添加到集合中。

「散列」將確保集合中的唯一性。所以,即使用戶拖放了已經存在於散列中的某些東西,原始值也會被新對象替換(但這並不重要,因爲它的值相同)。

然而,「密鑰」必須是唯一的....否則,哈希想法將無法正常工作。

0

謝謝Brice,這些功能很有幫助。

對於他們在Spark列表中工作,只需使用createDropIndicator而不是showDropFeedback更新第一個函數,並停止傳遞事件。

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