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