Показать сообщение отдельно
Старый 08.05.2012, 01:38
djyamato вне форума Посмотреть профиль Отправить личное сообщение для djyamato Посетить домашнюю страницу djyamato Найти все сообщения от djyamato
  № 1  
Ответить с цитированием
djyamato
 
Аватар для djyamato

Регистрация: Feb 2006
Сообщений: 884
Записей в блоге: 2
Отправить сообщение для djyamato с помощью ICQ Отправить сообщение для djyamato с помощью Skype™
По умолчанию DragDrop из List в List почему у получателя не меняется dataProvider

Здравствуйте
У меня есть 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 нет детей, а визуально он есть, тот который я перетащил
Код AS3:
trace("elements:"+DataGroup(galleryContent.scroller.viewport).numElements);
// elements:0
--------------
Вроде, сделал но как-то кривовато мне кажется, покритикуйте пожалуйста
Код AS3:
<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
Код AS3:
package
{
	[RemoteClass]
	public class SomeDataVO
	{
		public var id:int;
 
		[Bindable]
		public var label:String;
 
		public function SomeDataVO()
		{
 
		}
	}
}
ContentVO
Код AS3:
package
{
	[RemoteClass]
	public class ContentVO
	{
		public var id:int;
 
		[Bindable]
		public var label:String;
 
		[Bindable]
		public var data:SomeDataVO;
 
		public function ContentVO()
		{
 
		}
	}
}
Изображения
 


Последний раз редактировалось djyamato; 08.05.2012 в 14:47.