Customizing Commands
This article will demonstrate how to customize RadDataForm's commands in an MVVM-friendly way as well as how to execute them manually.
- The DataFormCommandProvider
- Designing a Custom DataFormCommandProvider
- Setting the Custom DataFormCommandProvider
- Executing Commands Manually
The DataFormCommandProvider
The public DataFormCommandProvider class exposes the "execute" and "can-execute" logic of all commands utilized by RadDataForm. RadDataForm processes these commands according to its current provider.
Execute Logic Methods
The methods listed below identify the logic that is executed when a certain command's invocation takes place.
Example 1: The IExecuteLogicMethods
void MoveCurrentToFirst();
void MoveCurrentToLast();
void MoveCurrentToNext();
void MoveCurrentToPrevious();
void BeginEdit();
void CommitEdit();
void Delete();
void CancelEdit();
void AddNew();Can-Execute Logic Methods
With the help of those methods you can identify whether a certain command can be executed or not.
Example 2: The ICanExecuteLogicMethods
bool CanMoveCurrentToFirstExecute();
bool CanMoveCurrentToLastExecute();
bool CanMoveCurrentToNextExecute();
bool CanMoveCurrentToPreviousExecute();
bool CanBeginEditExecute();
bool CanCommitEditExecute();
bool CanDeleteExecute();
bool CanCancelEditExecute();
bool CanAddNewExecute();A runnable demo that utilizes the code from this article can be found on the DataForm's CustomCommandsProvider demo.
Designing a Custom DataFormCommandProvider
The first step is to create your own class that inherits from DataFormCommandProvider:
Example 3: Defining a Custom CommandProvider
public class CustomCommandProvider : DataFormCommandProvider
{
public CustomCommandProvider() : base(null)
{
}
public CustomCommandProvider(RadDataForm dataForm)
: base(dataForm)
{
this.DataForm = dataForm;
}
//. . .
}You need to override the methods of the commands that will be customized. In the following example we will customize: MoveCurrentToNext, MoveCurrentToPrevious, BeginEdit and CancelEdit.
MoveCurrentToNext and MoveCurrentToPrevious
We aim at changing their execution logic, in order to start editing the item, as soon as it was set as a current one and bypass the logic in the same place. Here are the overridden methods:
Example 4: Customizing MoveCurrentToNext and MoveCurrentToPrevious
protected override void MoveCurrentToNext()
{
if (this.DataForm != null)
{
this.DataForm.MoveCurrentToNext();
this.DataForm.BeginEdit();
}
}
protected override void MoveCurrentToPrevious()
{
if (this.DataForm != null)
{
this.DataForm.MoveCurrentToPrevious();
this.DataForm.BeginEdit();
}
}CommitEdit and CancelEdit
A common requirement for data form is to add confirmation message boxes when CRUD operations are executed. Here we will do a similar thing with the CommitEdit/CancelEdit commands.
Example 5: Customizing CommitEdit and CancelEdit
protected override void CommitEdit()
{
MessageBoxResult result = MessageBox.Show("Commit changes for the current edit item?", "CommitEdit confirmation", MessageBoxButton.OKCancel);
if (result == MessageBoxResult.OK)
{
if (this.DataForm != null && this.DataForm.ValidateItem())
{
this.DataForm.CommitEdit();
}
}
}
protected override void CancelEdit()
{
MessageBoxResult result = MessageBox.Show("Cancel changes for the current edit item?", "CancelEdit confirmation", MessageBoxButton.OKCancel);
if (result == MessageBoxResult.OK)
{
if (this.DataForm != null)
{
this.DataForm.CancelEdit();
}
}
}Setting the Custom DataFormCommandProvider
The last thing to be done is to set the CommandProvider property of the RadDataForm to the newly-created CustomKeyboardCommandProvider class:
Example 6: Set the CommandProvider Property
<Grid.Resources>
<my:CustomCommandProvider x:Key="CustomProvider"/>
</Grid.Resources>
<telerik:RadDataForm x:Name="RadDataForm1"
ItemsSource="{Binding Employees}"
CommandProvider="{StaticResource CustomProvider}"/>
Example 6: Set the CommandProvider Property
this.RadDataForm1.CommandProvider = new CustomCommandProvider(this.RadDataForm1);Executing Commands Manually
Using the RadDataFormCommands class, you can set a sequence of commands to be performed one after another. So, for example, you may easily handle the click event of a button, move to the next item and put it in edit mode. However, when invoking the commands in such a manner a second parameter should be added, pointing out the target UI Element as shown in Exapmle 7.
Example 7: Executing a sequence of commands
private void Button1_Click(object sender, RoutedEventArgs e)
{
var moveToNextCommand = RadDataFormCommands.MoveCurrentToNext as RoutedUICommand;
var editCommand = RadDataFormCommands.BeginEdit as RoutedUICommand;
moveToNextCommand.Execute(null, this.DataForm);
editCommand.Execute(null, this.DataForm);
}