I see the difference and my initial explanation may have not been clear. In your example, dragging items from one folder to the next does work. We do not allow dragging items from one folder to another, so I'm not sure if that scenario is working for us or not. We are dragging rows from a grid view and dropping them in a folder. I'm not sure if that should make a difference.
Here is my code-behind. This may help identify what I'm doing wrong, or if I have left something out. I probably should have posted this in the first place. Sorry about that! I'm not the original developer of this code. I just tried to implement the new DragDropManager.
This is the code for allowing Drag from a grid view:
private
WeakReferenceOf<DataControl> _dataControl;
public
void
Initialize(DataControl control)
{
_dataControl =
new
WeakReferenceOf<DataControl>(control);
ConfigureControl();
}
private
void
ConfigureControl()
{
DragDropManager.SetAllowDrag(_dataControl.Target,
true
);
DragDropManager.AddDragInitializeHandler(_dataControl.Target, OnDragInitialize);
}
/// <summary>
/// Start dragging. Create Drag Cue by apllying custom Template
/// </summary>
private
static
void
OnDragInitialize(
object
sender, DragInitializeEventArgs e)
{
var control = e.Source
as
DataControl;
if
(control ==
null
)
{
e.Handled =
false
;
return
;
}
var items = control.SelectedItems
.Where(si => si
as
IFolderEntity !=
null
)
.Select(i => i
as
IFolderEntity)
.ToList();
if
(!items.Any())
{
e.Handled =
true
;
return
;
}
var payLoad = DragDropPayloadManager.GeneratePayload(
null
);
payLoad.SetData(
"DraggedData"
, items);
e.AllowedEffects = DragDropEffects.Move;
e.Data = payLoad;
e.DragVisual =
null
;
e.Handled =
true
;
}
public
void
UnregisterEvents()
{
DragDropManager.RemoveDragInitializeHandler(_dataControl.Target, OnDragInitialize);
_dataControl =
null
;
}
This is the code for TreeView when dropping:
private
RadTreeView TreeView {
get
;
set
; }
public
void
Initialize(RadTreeView treeView)
{
TreeView = treeView;
TreeView.ItemPrepared += TreeViewOnItemPrepared;
}
private
void
TreeViewOnItemPrepared(
object
sender, RadTreeViewItemPreparedEventArgs e)
{
DragDropManager.RemoveDragOverHandler(e.PreparedItem, OnItemDragOver);
DragDropManager.RemoveDropHandler(e.PreparedItem, OnDrop);
DragDropManager.AddDragOverHandler(e.PreparedItem, OnItemDragOver);
DragDropManager.AddDropHandler(e.PreparedItem, OnDrop);
}
private
void
OnItemDragOver(
object
sender, TDragEventArgs e)
{
var item = (e.OriginalSource
as
FrameworkElement).ParentOfType<RadTreeViewItem>();
item.AllowDrop =
false
;
var folder = item.GetFolder();
if
(folder ==
null
|| !folder.FolderTypeCode.CanDrop)
{
e.Handled =
true
;
return
;
}
var draggedData = DragDropPayloadManager.GetDataFromObject(e.Data,
"DraggedData"
);
var fe = ((List<IFolderEntity>)draggedData).FirstOrDefault();
if
(fe ==
null
)
{
e.Handled =
true
;
return
;
}
var tmpFolder = folder;
//Loop up the parents until you find the child of the WorkSpace folder
while
(tmpFolder.ParentFolder.FolderTypeCode.Id != FolderTypeCode.Workspace.Id)
{
tmpFolder = tmpFolder.ParentFolder;
}
if
(tmpFolder.FolderTypeCode.Id != fe.FolderTypeCode.Id)
{
e.Handled =
true
;
return
;
}
item.AllowDrop =
true
;
e.Handled =
true
;
}
private
void
OnDrop(
object
sender, TDragEventArgs e)
{
var item = (e.OriginalSource
as
FrameworkElement).ParentOfType<RadTreeViewItem>();
var draggedData = DragDropPayloadManager.GetDataFromObject(e.Data,
"DraggedData"
);
if
(draggedData ==
null
)
return
;
var folderEntities = draggedData
as
IEnumerable<IFolderEntity>;
if
(folderEntities ==
null
)
return
;
CreateFolderEntities(item, folderEntities);
e.Handled =
true
;
}