PDA

Просмотр полной версии : DragDrop из List в List почему у получателя не меняется dataProvider


djyamato
08.05.2012, 01:38
Здравствуйте
У меня есть 2 листа
Пользователь из первого перетаскивает объект ImageVO

Мне нужно чтобы при drop на 2м листе создавался объект в его дата провайдере (ContentVO) одним из свойств которого был бы перетаскиваемый ImageVO

Во 2 м листе в слушателе dragDrop дата провайдер не меняется. Почему ?

Далее я формирую новый объект ContentVO, добавляю его в dataProvider 2го листа и вижу 2 айтема в нем
1й - ImageVO и 2й-ContentVO. Причем, в дата провайдере 2го нет элемента ImageVO
Что мне сделать чтобы в листе 2м не появлялся перетянутый ImageVO ?

P.S. Проверил, после dragDrop у 2го листа в скроллере в DataDroup нет детей, а визуально он есть, тот который я перетащил

trace("elements:"+DataGroup(galleryContent.scroller.viewport).numElements);
// elements:0


--------------
Вроде, сделал но как-то кривовато мне кажется, покритикуйте пожалуйста

<fx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.core.DragSource;
import mx.events.CollectionEvent;
import mx.events.CollectionEventKind;
import mx.events.DragEvent;
import mx.events.FlexEvent;
import mx.managers.DragManager;
import mx.messaging.AbstractConsumer;
import mx.utils.ObjectUtil;

import spark.components.Image;

[Bindable]
protected var someDataAC:ArrayCollection=new ArrayCollection();

[Bindable]
protected var contentAC:ArrayCollection=new ArrayCollection();

protected function application1_creationCompleteHandler(event:FlexEvent):void
{
for(var i:int=0;i<5;i++)
{
var someData:SomeDataVO=new SomeDataVO();
someData.id=Math.round(Math.random()*100);
someData.label="data"+someData.id;
someDataAC.addItem(someData);
}
contentAC.addEventListener(CollectionEvent.COLLECTION_CHANGE,contentDPChangeHandler);
}

protected function contentList_dragDropHandler(event:DragEvent):void
{
var dropTarget:List=List(event.currentTarget);
var items:Array = Array(event.dragSource.dataForFormat("itemsByIndex"));

// если нет пока дата провайдера нужно его завести
if(!List(event.currentTarget).dataProvider)
{
List(event.currentTarget).dataProvider=new ArrayCollection();
}

// создание нового ContentVO, свойство data у которого брошенный в список объект SomeDataVO
var newContentVO:ContentVO=new ContentVO();
newContentVO.id=Math.round(Math.random()*1000);
newContentVO.data=items[0][0];
List(event.currentTarget).dataProvider.addItem(newContentVO);
}

protected function contentDPChangeHandler(event:CollectionEvent):void
{
switch(event.kind)
{
case CollectionEventKind.ADD:

// при изменении дата провайдера (добавление элемента) проверяю тип добавленного,
//если он НЕ ContentVO, элемент нужно удалить из дата провайдера
var indexesToRemove:Array=new Array();
var i:int;
for(i=0;i<contentList.dataProvider.length;i++)
{
if(!(contentList.dataProvider.getItemAt(i) is ContentVO))
{
indexesToRemove.push(i);
}
}

for(i=0;i<indexesToRemove.length;i++)
{
contentList.dataProvider.removeItemAt(indexesToRemove[i]);
}
break;
}
}
]]>
</fx:Script>

<s:HGroup>
<s:List id="dataList"
dragEnabled="true"
itemRenderer="SomeDataItemRenderer"
dataProvider="{someDataAC}"/>
<s:List id="contentList"
dropEnabled="true"
dataProvider="{contentAC}"
itemRenderer="ContentItemRenderer"
dragDrop="contentList_dragDropHandler(event)"/>
</s:HGroup>


SomeDataVO

package
{
[RemoteClass]
public class SomeDataVO
{
public var id:int;

[Bindable]
public var label:String;

public function SomeDataVO()
{

}
}
}


ContentVO

package
{
[RemoteClass]
public class ContentVO
{
public var id:int;

[Bindable]
public var label:String;

[Bindable]
public var data:SomeDataVO;

public function ContentVO()
{

}
}
}