Эй, это отличный вопрос, и довольно сложный. Поскольку Flex в первую очередь разрабатывается Adobe, у них нет возможностей / ресурсов / денег для покрытия крайних случаев / подобных настроек. Если бы только они децентрализовали развитие Flex!
Мне тоже приходилось сталкиваться с этой проблемой. Это сводится к тому факту, что Flex имеет жестко запрограммированные определенные «типы» источников данных в источнике ListBase , поэтому вы не можете изменять типы. Это хорошо и плохо ... Проверьте все drag[Type]Handler
методы в этом классе ListBase и посмотрите, что происходит.
Все, что нам нужно сделать, это перехватить событие DragEvent.DRAG_START
и вызвать event.stopImmediatePropagation()
(к счастью, flex это послушает!). Вот пример приложения:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application
xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
import mx.events.DragEvent;
import mx.managers.DragManager;
protected function updateDragSource():void
{
selected = !selected; // flip;
sourceType = selected ? "mySource" : "items";;
}
protected function dragEnterHandler(event:DragEvent):void
{
if (!event.dragSource.hasFormat(sourceType))
event.stopImmediatePropagation();
}
]]>
</mx:Script>
<mx:Boolean id="selected"/>
<mx:String id="sourceType">items</mx:String>
<mx:TileList id="list" width="100%" height="100%" labelField="name"
dragEnabled="true" dropEnabled="true" dragMoveEnabled="true"
dragEnter="dragEnterHandler(event)">
<mx:dataProvider>
<mx:ArrayCollection>
<mx:Object name="one"/>
<mx:Object name="two"/>
<mx:Object name="three"/>
<mx:Object name="four"/>
</mx:ArrayCollection>
</mx:dataProvider>
</mx:TileList>
<mx:Label text="Change Drag Source Type:"/>
<mx:Button id="button" click="updateDragSource()" label="{sourceType}"/>
</mx:Application>
Это дает вам базу для проверки, если dragSource.hasFormat
возвращает true / false. Если вы хотите изменить формат DragSource на , вам придется расширить TileList и переопределить все методов перетаскивания: /. items
и orderedItems
жестко запрограммированы в ListBase, поэтому вы не можете легко изменить формат.
Единственный способ использовать свои собственные форматы - не использовать какие-либо классы, расширяющие ListBase, и реализовать собственную систему перетаскивания. Это не так уж плохо. Причина в том, что, если вы посмотрите на все обработчики событий перетаскивания в ListBase, у них есть такие вещи:
var dragSource:DragSource = event.dragSource;
if (!dragSource.hasFormat("items") && !dragSource.hasFormat("orderedItems"))
return;
Так что, если они не в этом формате, вам не удастся перетащить.
Надеюсь, это поможет,
Lance