public void Validate()
    {
        ModelPropertyPair pair  = this.GetModelPropertyChain().Last();
        object            value = this.GetValueToValidate();
        object            convertedValue;

        if (!this.TryConvertValue(value, out convertedValue))
        {
            this.ErrorProvider.SetError(this.ControlToValidate,
                                        "Value is invalid.");
            return;
        }
        string errorMessage = this.GetValidationErrorOrNull(pair, convertedValue);

        this.ErrorProvider.SetError(this.ControlToValidate, errorMessage);
    }
    private string GetValidationErrorOrNull(ModelPropertyPair pair, object value)
    {
        var context = new ValidationContext(pair.Model)
        {
            MemberName = pair.Property.Name
        };

        try
        {
            Validator.ValidateValue(value, context, this.ValidationAttributes);
            return(null);
        }
        catch (ValidationException ex)
        {
            return(ex.Message);
        }
    }