Commands

The Command design-pattern is very important and widely used in the XAML and MVVM world. RadTreeView follows these best practices and provides an intuitive and easy-to-use set of APIs that allow different aspects of the RadTreeView control’s behavior to be handled and/or completely overridden.

RadTreeView exposes a Commands collection that allows you to register custom commands with each control’s instance through the RadTreeView.Commands property:

  • Commands: Gets the collection with all the custom commands registered with the CommandService.

Command Types

There are two types of commands:

  • TreeViewCommand: All the default commands within RadTreeView derive from the base TreeViewCommand. Think of this command as a UI-related command as it operates over the RadTreeView instance that owns the command.

  • TreeViewUserCommand: This type of command should be used when you would like to modify the behavior of the control on any of the available actions. It exposes the following properties:

    • Id: The key that relates a command instance to a particular action/routine.
    • Command: Gets or sets the generic ICommand implementation that may come from the ViewModel.
    • SuppressDefaultCommand: Gets or sets a value indicating whether the default(built-in) UI command associated with the specified Id will be executed.

TreeViewCommandId Enumeration

All the predefined commands within a RadTreeView instance are identified by a member of the TreeViewCommandId enumeration. This is actually the key that relates a command instance to a particular action/routine within the owning element. In order to register a custom command within a RadTreeView instance you should instantiate a TreeViewUserCommand instance and set its ID and Command properties. Following are the members of the TreeViewCommandId enumeration:

  • ItemTap
  • ItemHold
  • ItemCollapse
  • ItemExpand
  • LoadOnDemand
  • Unknown

Custom TreeViewUserCommand Example

As a first step, you can create a command property which will invoke custom method on ItemTap. Here is how this is done inside the ViewModel of the TreeView:

public class ViewModel
{
    public ObservableCollection<Item> Source { get; set; }
    public ICommand MyTapCommand { get; set; }

    public ViewModel()
    {
        this.MyTapCommand = new Command((p) => OnItemTap(p));

        this.Source = new ObservableCollection<Item>();
        this.Source.Add(new Item("Contacts")
        {
            Children = new List<Item>()
            {
                new Item("Bob Tony"),
                new Item("Sue Winchell"),
                new Item("Lui Sang")
            }
        });
        this.Source.Add(new Item("Lists")
        {
            Children = new List<Item>()
            {
                new Item("Priorities"),
                new Item("Opportunities"),
                new Item("Issues")
            }
        });
        this.Source.Add(new Item("Reports")
        {
            Children = new List<Item>()
            {
                new Item("December Sales"),
                new Item("First Quarter Summary"),
                new Item("Second Quarter Summary")
            }
        });
    }
    private void OnItemTap(object p)
    {
        var context = (TreeViewItemCommandContext)p;
        //add your logic here
        Application.Current.MainPage.DisplayAlert("", "You clicked on: " + (context.Item as Item).Name, "OK");
    }
}

Once you have created the custom command, you need to add it to the Commands collection of the RadTreeView element:

<telerikDataControls:RadTreeView x:Name="treeView"
                                 ItemsSource="{Binding Source}">
    <telerikDataControls:RadTreeView.Commands>
        <telerikTreeView:TreeViewUserCommand Id="ItemTap" 
                                      SuppressDefaultCommand="False" 
                                      Command="{Binding MyTapCommand}"/>
    </telerikDataControls:RadTreeView.Commands>
    <telerikDataControls:TreeViewDescriptor DisplayMemberPath="Name"
                                            ItemsSourcePath="Children"
                                            TargetType="{x:Type local:Item}"/>
</telerikDataControls:RadTreeView>

Where the telerikTreeView namespace is the following:

xmlns:telerikTreeView="clr-namespace:Telerik.XamarinForms.DataControls.TreeView.Commands;assembly=Telerik.XamarinForms.DataControls"

You can check a runnable demo in the Features section of the RadTreeView component in the SDK Samples Browser application(can be found in the Examples folder of your local Telerik UI for Xamarin installation)