Hooking a command to validation automatically

It is possible to hook the CanExecute of a Command to the IValidationSummary automatically. This way, there is no need to check for errors manually in the CanExecute method. The example below first adds a validation summary to a view model to get the validation result. Then, it uses this validation summary to automatically determine whether a command can be executed.

1. Add validation to a person view model (note how the validation adds the tag PersonValidation to a validation):

/// <summary>
/// Validates the field values of this object. Override this method to enable
/// validation of field values.
/// </summary>
/// <param name="validationResults">The validation results, add additional results to this list.</param>
protected override void ValidateFields(System.Collections.Generic.List<IFieldValidationResult> validationResults)
{
    if (string.IsNullOrEmpty(FirstName))
    {
        validationResults.Add(FieldValidationResult.CreateErrorWithTag(FirstNameProperty, "First name cannot be empty", "PersonValidation"));
    }

    if (string.IsNullOrEmpty(LastName))
    {
        validationResults.Add(FieldValidationResult.CreateErrorWithTag(LastNameProperty, "Last name cannot be empty", "PersonValidation"));
    }
}

2. Add a property to the view model containing the validation summary using the ValidationToViewModel attribute.

[ValidationToViewModel(Tag = "PersonValidation")]
public IValidationSummary PersonValidationSummary { get; set; }
  1. Define a command on the view model:

    /// <summary>
    /// Gets the Save command.
    /// </summary>
    public Command Save { get; private set; }
    
    /// <summary>
    /// Method to invoke when the Save command is executed.
    /// </summary>
    private void OnSaveExecute()
    {
    // TODO: Handle command logic here
    }
    
  2. Create the command that automatically uses the validation summary using the CommandHelper class:

    Save = CommandHelper.CreateCommand(OnSaveExecute, () => PersonValidationSummary);
    

With this example, the Save command on the view model can only be executed when there are no errors with the PersonValidation tag.


Contributions

We would like to thank the following contributors:

Want to contribute to the documentation? We have a guide for that!


Questions

Have a question about Catel? Use StackOverflow with the Catel tag!


Discussion