How to highlight and select Drop Target TreeViewItem?

6 posts, 1 answers
  1. Sven
    Sven avatar
    4 posts
    Member since:
    Jun 2012

    Posted 23 Jul 2012 Link to this post

    Hell out there!
    Maybe sbd. out the can help me. I want to implement a drag and drop operation from RadGridView to RadTreeView. But I am too silly.
    So, in GridView DragQuery event, I fill the payload:
    private void grdSessions_DragQuery(object sender, Telerik.Windows.Controls.DragDrop.DragDropQueryEventArgs e)
    {
        e.QueryResult = true;
        if (e.Options.Status != DragStatus.DragQuery)
            return;           
        var sessionToDrag = (XTSession)grdSessions.SelectedItem;
        if (sessionToDrag != null)
        {
            e.Options.Payload = sessionToDrag;
            e.Options.DragCue = RadDragAndDropManager.GenerateVisualCue();
            e.Options.ArrowCue = RadDragAndDropManager.GenerateArrowCue();               
        }           
    }


    I also implemented the DropQuery and DropInfo of the TreeView:

    private void tvwNodes_DropQuery(object sender, Telerik.Windows.Controls.DragDrop.DragDropQueryEventArgs e)
            {
                if (e.Options.Payload is XTSession)
                {
                    e.QueryResult = true;
                }           
            }
     
    private void tvwNodes_DropInfo(object sender, DragDropEventArgs e)
            {           
                if (e.Options.Status == DragStatus.DropComplete)
                {
                    if (e.Options.Payload is XTSession)
                    {
                            // Do the stuff
                    }
                }
            }


    My Problem is now, that I have no Idea how to higlight and track the target treeviewitem? When I move the mouse cursor over a treenode in drop mode, I want this treenode to be highlighted. How can this be done? And how can I find out on which node the the drop was done in DropInfo event? The destination object contains the whole treeview. Also, I should disable drop if the mouse cursor is not over a treeviewitem. How can this be done?
    Can anybody help me out?

    Thanks in advance.

    brgds
    Sven Weiberg
  2. Answer
    Tina Stancheva
    Admin
    Tina Stancheva avatar
    3298 posts

    Posted 26 Jul 2012 Link to this post

    Hello Sven,

    First of all I'd advice you to take advantage of the new DragAndDropManager as it is more powerful and support a great number of drag and drop scenarios. This makes it a better choice when starting to build a drag/drop application. 

    However, it is also important to note that the RadTreeView control built-in drag/drop implementation still relies on the old RadDragAndDropManager but we're planning to migrate it to the new manager in the future. 

    Having that in mind, I prepared a sample solution demonstrating how to implement drag and drop operation between the RadTreeView and the RadGridView controls. The solution relies on the new DragAndDropManager and specifically on DragDropBehavior  classes that define the drag/drop logic behind both controls. 

    Also, in order to add a visual feedback when dragging over a RadTreeViewItem, I added event handlers for the DragEnter and DragLeave events and I update the visual state of the tree items accordingly. Please have a look at this solution and let us know if it works for you or if we can assist you with anything else.

    All the best,
    Tina Stancheva
    the Telerik team

    Explore the entire Telerik portfolio by downloading Telerik DevCraft Ultimate.

  3. UI for WPF is Visual Studio 2017 Ready
  4. Sven
    Sven avatar
    4 posts
    Member since:
    Jun 2012

    Posted 26 Jul 2012 Link to this post

    Ok, this gives me a little help. Thanks. But it seems to be much code, espacially for my needs. Isn't there a way to use the provided DragDropBehavior and derive from it?

    brgds
    Sven
  5. Tina Stancheva
    Admin
    Tina Stancheva avatar
    3298 posts

    Posted 30 Jul 2012 Link to this post

    Hello Sven,

    At the moment this is the best approach for your scenario. However, once the RadTreeView built-in drag/drop logic is changed to use the new DragDropManager, there should be an easier implementation of your scenario. Unfortunately at this time I cannot bind to a timeframe when this task will be addressed.

    Regards,

    Tina Stancheva
    the Telerik team

    Explore the entire Telerik portfolio by downloading Telerik DevCraft Ultimate.

  6. Sven
    Sven avatar
    4 posts
    Member since:
    Jun 2012

    Posted 02 Aug 2012 Link to this post

    Well. Unfortunately it does not work in my project. The DragInitialize Event is not called, allthough DragDropManager.AddDragInitializeHandler is executed at the beginning.
    Do you have any Idea what I might have done wrong? I have no Idea...

    brgds
    Sven

    private RadGridView _associatedObject;
            /// <summary>
            /// AssociatedObject Property
            /// </summary>
            public RadGridView AssociatedObject
            {
                get
                {
                    return _associatedObject;
                }
                set
                {
                    _associatedObject = value;
                }
            }
     
            private static Dictionary<RadGridView, SessionGridDragDropBehavior> instances;
     
            static SessionGridDragDropBehavior()
            {
                instances = new Dictionary<RadGridView, SessionGridDragDropBehavior>();
            }
     
            public static bool GetIsEnabled(DependencyObject obj)
            {
                return (bool)obj.GetValue(IsEnabledProperty);
            }
     
            public static void SetIsEnabled(DependencyObject obj, bool value)
            {
                SessionGridDragDropBehavior behavior = GetAttachedBehavior(obj as RadGridView);
     
                behavior.AssociatedObject = obj as RadGridView;
     
                if (value)
                {
                    behavior.Initialize();
                }
                else
                {
                    behavior.CleanUp();
                }
                obj.SetValue(IsEnabledProperty, value);
            }
     
            // Using a DependencyProperty as the backing store for IsEnabled.  This enables animation, styling, binding, etc...
            public static readonly DependencyProperty IsEnabledProperty =
                DependencyProperty.RegisterAttached("IsEnabled", typeof(bool), typeof(SessionGridDragDropBehavior),
                    new PropertyMetadata(new PropertyChangedCallback(OnIsEnabledPropertyChanged)));
     
            public static void OnIsEnabledPropertyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
            {
                SetIsEnabled(dependencyObject, (bool)e.NewValue);
            }
     
            private static SessionGridDragDropBehavior GetAttachedBehavior(RadGridView gridview)
            {
                if (!instances.ContainsKey(gridview))
                {
                    instances[gridview] = new SessionGridDragDropBehavior();
                    instances[gridview].AssociatedObject = gridview;
                }
     
                return instances[gridview];
            }
     
            protected virtual void Initialize()
            {
                this.UnsubscribeFromDragDropEvents();
                this.SubscribeToDragDropEvents();
            }
     
            protected virtual void CleanUp()
            {
                this.UnsubscribeFromDragDropEvents();
            }
     
            private void SubscribeToDragDropEvents()
            {
                DragDropManager.AddDragInitializeHandler(this.AssociatedObject, OnDragInitialize);
                DragDropManager.AddGiveFeedbackHandler(this.AssociatedObject, OnGiveFeedback);
                DragDropManager.AddDropHandler(this.AssociatedObject, OnDrop);
                DragDropManager.AddDragDropCompletedHandler(this.AssociatedObject, OnDragDropCompleted);
                DragDropManager.AddDragOverHandler(this.AssociatedObject, OnDragOver);
            }
     
            private void UnsubscribeFromDragDropEvents()
            {
                DragDropManager.RemoveDragInitializeHandler(this.AssociatedObject, OnDragInitialize);
                DragDropManager.RemoveGiveFeedbackHandler(this.AssociatedObject, OnGiveFeedback);
                DragDropManager.RemoveDropHandler(this.AssociatedObject, OnDrop);
                DragDropManager.RemoveDragDropCompletedHandler(this.AssociatedObject, OnDragDropCompleted);
                DragDropManager.RemoveDragOverHandler(this.AssociatedObject, OnDragOver);
            }
     
            private void OnDragInitialize(object sender, DragInitializeEventArgs e)
            {
                var data = (sender as RadGridView).SelectedItem;
            }
     
            private void OnGiveFeedback(object sender, Telerik.Windows.DragDrop.GiveFeedbackEventArgs e)
            {
                e.SetCursor(Cursors.Arrow);
                e.Handled = true;
            }
     
            private void OnDragDropCompleted(object sender, DragDropCompletedEventArgs e)
            {
            }
     
            private void OnDrop(object sender, Telerik.Windows.DragDrop.DragEventArgs e)
            {
            }
     
            private void OnDragOver(object sender, Telerik.Windows.DragDrop.DragEventArgs e)
            {
            }
  7. Sven
    Sven avatar
    4 posts
    Member since:
    Jun 2012

    Posted 02 Aug 2012 Link to this post

    Ok. I found the solution. I did not set the attached dependcy property AllowDrag for the grid row.
Back to Top
UI for WPF is Visual Studio 2017 Ready