2009-10-19 100 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); 
}