我有一个Flex问题。我想知道,如果我有两个列表框,并且我想在它们之间拖放,我该如何阻止用户拖到同一个列表上(因此复制项目?我不能有这样的情况,那就是谢谢你们。
答案 0 :(得分:2)
没有测试过,但我想这样的事情应该有效:
在两个列表中收听dragStart
事件,并根据source
设置event.target
变量。现在,请听取两个列表中的dragDrop
事件,如果event.preventDefault()
与source
相同,请致电target
。
答案 1 :(得分:2)
以下是我在构建一个工作应用程序时所做的一些简单的功能,我常常将头部绕着柔性拖放。我一直在寻找一种方法来拥有多个具有拖放功能的列表,这些列表不会相互干扰。另外,我不想处理复制列表数据。
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();"
/>
答案 2 :(得分: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="->" enabled="{enabled}" click="add()"/>
<mx:Button label="<-" 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”,现在基本上没有重新添加到同一个列表中的一个项目,但只是移动顺序(这对我来说无关紧要,因为它是一个肥皂发送和后面-logic无论如何都会把它放到正确的顺序。)
答案 3 :(得分:0)
在我的情况下,我使用了HashCollection(扩展了ArrayCollection)[只是google它,你会找到组件]。数据提供者绑定到此集合。您可以使用:dataprovider.put(key,object)而不是dataprovider.addItem(object)将项添加到集合中。
“哈希”将确保集合中的唯一性。因此,即使用户拖放已存在于散列中的内容,原始值也会被新对象替换(但这并不重要,因为它是相同的值)。
然而,“密钥”必须是唯一的......否则,哈希的想法将无效。
答案 4 :(得分:0)
感谢Brice,这些功能很有帮助。
要让他们在Spark列表中工作,只需使用createDropIndicator而不是showDropFeedback更新第一个函数,然后停止传递事件。
private function onlyAllowMoveDragOverHandlerS(event:DragEvent):void {
event.preventDefault();
event.currentTarget.createDropIndicator();
DragManager.showFeedback(DragManager.MOVE);
}