Hello Telerik,
During a Drag&Drop in a RadTreeView, I encounter some troubles with TreeViewDragDropOptions where the dropped item is positioned. Ideally I would like to get the objects that are positioned before and after (if they exist) the dropped item.
However, following multiple found example (like this one), in my case, the content of TreeViewDragDropOptions is always null.
Those are the objects I am binding to the TreeView:
Node.cs
public
class
Node<T>
{
public
T Source
{
get
;
set
;
}
public
Node<T> Parent
{
get
;
set
;
}
public
List<Node<T>> Children =
new
List<Node<T>>();
}
Here T is a Category
Category.cs
public
class
Category
{
public
string
Title
{
get
;
set
;
}
public
int
Sort
{
get
;
set
;
}
}
In the ViewModel, an ObservableCollection contains the hierarchy.
public
ObservableCollection<Node<Category>> MyCategories
{
[...]
}
Finally, the Views:
MyView.xaml
<
telerik:RadTreeListView
Name
=
"CategoriesRadTreeView"
IsDragDropEnabled
=
"True"
telerik:TreeViewSettings.DragDropExecutionMode
=
"New"
ItemsSource
=
"{Binding MyCategories}"
AutoGenerateColumns
=
"False"
>
<
telerik:RadTreeListView.ChildTableDefinitions
>
<
telerik:TreeListViewTableDefinition
ItemsSource
=
"{Binding Children}"
/>
</
telerik:RadTreeListView.ChildTableDefinitions
>
<
telerik:RadTreeListView.SortDescriptors
>
<
telerik:SortDescriptor
Member
=
"Source.Sort"
SortDirection
=
"Ascending"
/>
</
telerik:RadTreeListView.SortDescriptors
>
<
telerik:RadTreeListView.Columns
>
<
telerik:GridViewDataColumn
DataMemberBinding
=
"{Binding Source.Title}"
Header
=
"Title"
/>
<
telerik:GridViewDataColumn
DataMemberBinding
=
"{Binding Source.Sort}"
Header
=
"Sort"
/>
</
telerik:RadTreeListView.Columns
>
</
telerik:RadTreeListView
>
And the code behind:
MyView.xaml.cs
public
WebstoreKatalogView()
{
InitializeComponent();
DragDropManager.AddDragInitializeHandler(CategoriesRadTreeView, OnDragInitialize);
DragDropManager.AddDragOverHandler(CategoriesRadTreeView, OnDragOver,
true
);
DragDropManager.AddDropHandler(CategoriesRadTreeView, OnDrop);
}
private
void
OnDragInitialize(
object
sender, DragInitializeEventArgs e)
{
e.AllowedEffects = DragDropEffects.All;
var payload = DragDropPayloadManager.GeneratePayload(
null
);
var data = ((FrameworkElement)e.OriginalSource).DataContext;
payload.SetData(
"DragData"
, data);
e.Data = payload;
e.Handled =
true
;
}
private
void
OnDragOver(
object
sender, Telerik.Windows.DragDrop.DragEventArgs e)
{
var options = DragDropPayloadManager.GetDataFromObject(e.Data, TreeViewDragDropOptions.Key)
as
TreeViewDragDropOptions;
if
(options !=
null
)
{
// never reaches here!
}
}
private
void
OnDrop(
object
sender, Telerik.Windows.DragDrop.DragEventArgs e)
{
// this works!
var node = DragDropPayloadManager.GetDataFromObject(e.Data,
"DragData"
);
}
I have no idea what is wrong or what could be missing.
Thank you very much for your help!
Sylvain