# Commands Overview

The DataGrid provides an intuitive set of APIs that allow different aspects of its behavior to be handled and/or overridden. To control the behavior of the component, you can add commands through the `Commands` property, which gets a collection with all of the custom commands registered with the `CommandService` property.

## CommmandService

The DataGrid exposes a `CommandService` property which provides the following methods:

* `CanExecuteCommand(CommandId id, object parameter)`—Determines whether the command, associated with the specified `Id`, can be executed based on the provided parameter. If a custom command with the provided `Id` is added to the `Commands` collection, it will take precedence over the default (built-in) one.

* `CanExecuteDefaultCommand(CommandId id, object parameter)`—Determines whether the default command, associated with the specified `Id`, can be executed based on the provided parameter.

* `ExecuteCommand(CommandId id, object parameter)`—Attempts to find the command, associated with the specified `Id`, and to perform its `Execute` routine by using the provided parameter. If a custom command with the provided `Id` is added to the `Commands` collection, it will take precedence over the default one.

* `ExecuteDefaultCommand(CommandId id, object parameter)`—Executes the default command (without looking for user-defined commands) that is associated with the specified `Id`.

## Command Types

The DataGrid supports the following types of commands:

* `DataGridCommand`—All the default commands within the DataGrid derive from the base `DataGridCommand`. Think of this command as a UI-related one as it operates over the DataGrid instance that owns the command.

  > Custom commands take precedence over the built-in (default) ones.

* `DataGridUserCommand`—This specific command type provides an abstraction for the UI-related commands over a stateless and UI-agnostic generic command implementation. `DataGridUserCommand` exposes the following properties:

  * `Id`—Gets or sets the `CommandId` member with which this command is associated.
  * `Command`—Gets or sets the generic `ICommand` implementation that may come from the `ViewModel`.
  * `EnableDefaultCommand`—Gets or sets a value indicating whether the default UI command associated with the specified `Id` will be executed. The default value is `True`.

#### **Bind to a Command in the ViewModel**

```XAML
<Grid xmlns:grid="using:Telerik.UI.Xaml.Controls.Grid"
	  xmlns:gridCommands="using:Telerik.UI.Xaml.Controls.Grid.Commands">
	<grid:RadDataGrid Width="600" Height="460" x:Name="grid">
		<grid:RadDataGrid.Commands>
			<gridCommands:DataGridUserCommand Id="CellTap" Command="{Binding MyCommand}"/>
		</grid:RadDataGrid.Commands>
	</grid:RadDataGrid>
</Grid>
```

## CommandId Enumeration

All the predefined commands are identified by a member of the `CommandId` enumeration. This is actually the key that relates a command instance to a particular action or routine within the owning grid. To register a custom command, either inherit the `DataGridCommand` class and override its `CanExecute` and `Execute` methods, or instantiate a `DataGridUserCommand` instance and set its `Command` property. In both cases you need to set the `Id` property of the new command so that it can be properly associated with the desired action or event.

`CommandId` supports the following enumerations:

* [`BeginEdit`](https://www.telerik.com/winui/documentation/controls/raddatagrid/commands/editing-commands/datagrid-editingcommands-begineditcommand)
* [`CancelEdit`](https://www.telerik.com/winui/documentation/controls/raddatagrid/commands/editing-commands/datagrid-editingcommands-canceleditcommand)
* [`CommitEdit`](https://www.telerik.com/winui/documentation/controls/raddatagrid/commands/editing-commands/datagrid-editingcommands-commiteditcommand)
* [`ColumnHeaderTap`](https://www.telerik.com/winui/documentation/controls/raddatagrid/commands/datagrid-columnheadertapcommand)
* [`GroupHeaderTap`](https://www.telerik.com/winui/documentation/controls/raddatagrid/commands/datagrid-groupheadertapcommand)
* [`CellTap`](https://www.telerik.com/winui/documentation/controls/raddatagrid/commands/datagrid-celltapcommand)
* [`CellDoubleTap`](https://www.telerik.com/winui/documentation/controls/raddatagrid/commands/datagrid-celldoubletappedcommand)
* [`CellPointerOver`](https://www.telerik.com/winui/documentation/controls/raddatagrid/commands/datagrid-cellpointerovercommand)
* [`GenerateColumn`](https://www.telerik.com/winui/documentation/controls/raddatagrid/commands/datagrid-generatecolumncommand)
* [`DataBindingComplete`](https://www.telerik.com/winui/documentation/controls/raddatagrid/commands/datagrid-databindingcompletecommand)
* [`FlyoutGroupHeader`](https://www.telerik.com/winui/documentation/controls/raddatagrid/commands/datagrid-flyoutgroupheadertapcommand)
* [`FilterButtonTap`](https://www.telerik.com/winui/documentation/controls/raddatagrid/commands/datagrid-filterbuttontapcommand)
* [`ToggleColumnVisibility`](https://www.telerik.com/winui/documentation/controls/raddatagrid/commands/datagrid-togglecolumnvisibilitycommand)
