void MoveSelectedRowsToGroup(DragDropManagerBase sourceManager, int groupRowHandle, DependencyObject hitElement) {
			GroupInfo[] groupInfo = GetGroupInfos(groupRowHandle);
			if(!CanMoveSelectedRowsToGroup(sourceManager, groupInfo, hitElement))
				return;
			foreach(object obj in sourceManager.DraggingRows) {
				foreach(GroupInfo item in groupInfo) {
					SetPropertyValue(sourceManager.GetObject(obj), item.FieldName, item.Value);
				}
				if(!ItemsSource.Contains(obj)) {
					sourceManager.ItemsSource.Remove(sourceManager.GetObject(obj));
					ItemsSource.Add(sourceManager.GetObject(obj));
				}
			}
		}
		void MoveSelectedRows(DragDropManagerBase sourceManager, int insertRowHandle, DependencyObject hitElement) {
			object insertObject = GridControl.GetRow(insertRowHandle);
			if(insertObject == null || sourceManager.DraggingRows.Contains(GridControl.GetRow(insertRowHandle)))
				return;
			FrameworkElement row = GetRowElement(hitElement);
			DropTargetType dropTargetType = GetDropTargetType(row);
			if(dropTargetType == DropTargetType.None)
				return;
			int index = ItemsSource.IndexOf(insertObject);
			if(dropTargetType == DropTargetType.InsertRowsAfter)
				index++;
			GridControl.BeginDataUpdate();
			foreach(object obj in sourceManager.DraggingRows) {
				object sourceObject = sourceManager.GetObject(obj);
				if(ReferenceEquals(ItemsSource, sourceManager.GetSource(obj))) {
					if(index > ItemsSource.IndexOf(sourceObject))
						index--;
				}
				sourceManager.ItemsSource.Remove(sourceObject);
				ItemsSource.Insert(index, sourceObject);
				index++;
			}
			GridControl.EndDataUpdate();
			if(RestoreSelection) {
				int startRowHandle = GridControl.GetRowHandleByListIndex(ItemsSource.IndexOf(sourceManager.DraggingRows[0]));
				int endRowHandle = GridControl.GetRowHandleByListIndex(ItemsSource.IndexOf(sourceManager.DraggingRows[sourceManager.DraggingRows.Count - 1]));
				TableView.SelectRange(startRowHandle, endRowHandle);
			} else
				TableView.ClearSelection();
			TableView.FocusedRow = sourceManager.DraggingRows[0];
		}
		protected override void AddRow(DragDropManagerBase sourceManager, object row, int insertRowHandle) {
			sourceManager.GetSource(row).Remove(sourceManager.GetObject(row));
			DropStrategy.DropObject(ItemsSource, null, DropTargetType.DataArea, sourceManager.GetObject(row));
			InsertObject(ItemsSource, null, DropTargetType.DataArea, sourceManager.GetObject(row), -1);
		}
		void MoveSelectedRows(DragDropManagerBase sourceManager, int insertRowHandle, DependencyObject hitElement) {
			TreeListNode insertNode = TreeListView.GetNodeByRowHandle(insertRowHandle);
			object insertObject = insertNode.Content;
			if(insertObject == null || sourceManager.DraggingRows.Contains(insertObject))
				return;
			DropTargetType dropTargetType = GetDropTargetType(GetRowElement(hitElement) as DataContentPresenter);
			if(dropTargetType == DropTargetType.None)
				return;
			DataControl.BeginDataUpdate();
			IList source = GetSource(insertNode);
			int insertIndex = source.IndexOf(insertNode.Content)
				+ (dropTargetType == DropTargetType.InsertRowsAfter ? 1 : 0);
			foreach(object obj in sourceManager.DraggingRows) {
				if(ReferenceEquals(source, sourceManager.GetSource(obj))) {
					if(insertIndex > source.IndexOf(GetObject(obj)))
						insertIndex--;
					if(ReferenceEquals(insertObject, sourceManager.GetObject(obj)))
						continue;
				}
				sourceManager.GetSource(obj).Remove(sourceManager.GetObject(obj));
				DropStrategy.DropObject(source, insertNode, dropTargetType, sourceManager.GetObject(obj));
				InsertObject(source, insertNode, dropTargetType, sourceManager.GetObject(obj), insertIndex);
				insertIndex++;
			}
			DataControl.EndDataUpdate();
			if(TreeListView.MultiSelectMode == TableViewSelectMode.Row && RestoreSelection) {
				int[] selectedHandles = TreeListView.GetSelectedRowHandles();
				int startRowHandle = selectedHandles[0];
				int endRowHandle = selectedHandles[selectedHandles.Length - 1];
				TreeListView.SelectRange(startRowHandle, endRowHandle);
			} else TreeListView.ClearSelection();
			TreeListView.FocusedRow = GetObject(sourceManager.DraggingRows[0]);
		}
		protected internal override void OnDrop(DragDropManagerBase sourceManager, UIElement source, Point pt) {
			ListBoxDropEventArgs e = RaiseDropEvent(sourceManager);
			if(!e.Handled) {
				if(sourceManager.DraggingRows.Count > 0 && AllowDrop && !ReferenceEquals(this, sourceManager)) {
					foreach(object obj in sourceManager.DraggingRows) {
						object rawObject = sourceManager.GetObject(obj);
						sourceManager.GetSource(obj).Remove(rawObject);
						ItemsSource.Add(rawObject);
					}
				}
			}
			RaiseDroppedEvent(sourceManager, e.DraggedRows);
		}