Edit this page

Enable Only Drop Inside

This tutorial demonstrates how to enable dropping inside the RadTreeViewItems, but not around them.

For the purpose of this tutorial will be used the following treeview declaration:

XAML

<UserControl.Resources>
    <sampleData:RadTreeViewSampleData x:Key="DataSource"/>
    <DataTemplate x:Key="Team">
        <TextBlock Text="{Binding Name}"/>
    </DataTemplate>

    <telerik:HierarchicalDataTemplate x:Key="Division"
        ItemsSource="{Binding Teams}"
        ItemTemplate="{StaticResource Team}">
        <TextBlock Text="{Binding Name}"/>
    </telerik:HierarchicalDataTemplate>

    <telerik:HierarchicalDataTemplate x:Key="League" 
        ItemsSource="{Binding Divisions}"
        ItemTemplate="{StaticResource Division}">
        <TextBlock Text="{Binding Name}"/>
    </telerik:HierarchicalDataTemplate>
</UserControl.Resources>

<Grid x:Name="LayoutRoot" Background="White">
        <telerik:RadTreeView x:Name="xTreeView"
                             Margin="8"
                             IsDragDropEnabled="True"
                             ItemTemplate="{StaticResource League}"
                             ItemsSource="{Binding Source={StaticResource DataSource},
                                                   Path=LeaguesDataSource}"/>
</Grid>

The RadTreeView is data bound to a collection of business objects. For more information, read the Binding to Object topic.

In order to implement only drop inside you need to perform the following steps:

  • Attach to the DragDropManager DragOver event:

    C#

    DragDropManager.AddDragOverHandler(xTreeView, OnDragOver, true)
    

    VB.NET

    DragDropManager.AddDragOverHandler(xTreeView, OnDragOver, True)
    

    RadTreeView handles internally the DragDropManager events and in order to invoke a custom handler, you need to explicitly specify that you're adding a handler that should be invoked even for already handled events. This is done through the last - bool argument of the DragDropManager.AddDragOverHandler extension method.

  • In the event handler you should use the following code:

    C#

    private void OnDragOver(object sender, Telerik.Windows.DragDrop.DragEventArgs e)
    {
        var options = DragDropPayloadManager.GetDataFromObject(e.Data, TreeViewDragDropOptions.Key) as TreeViewDragDropOptions;
        if (options!=null && options.DropPosition != Telerik.Windows.Controls.DropPosition.Inside)
        {
            options.DropPosition = Telerik.Windows.Controls.DropPosition.Inside;
            options.UpdateDragVisual();
        }
    }
    

    VB.NET

    Private Sub OnDragOver(sender As Object, e As Telerik.Windows.DragDrop.DragEventArgs)
        Dim options = TryCast(DragDropPayloadManager.GetDataFromObject(e.Data, TreeViewDragDropOptions.Key), TreeViewDragDropOptions)
        If options IsNot Nothing AndAlso options.DropPosition <> Telerik.Windows.Controls.DropPosition.Inside Then
            options.DropPosition = Telerik.Windows.Controls.DropPosition.Inside
            options.UpdateDragVisual()
        End If
    End Sub
    

    Please note that if you want the changes applied on the TreeViewDragDropOptions object to affect the DragVisual element, you have to invoke the UpdateDragVisual() method.

You can download a runnable project of the demonstrated example from our online SDK repository here, after navigating to TreeView/EnableOnlyDropInsideItem.

See Also