Условная проверка WPF

У меня проблемы с проверкой адреса электронной почты в моей модели представления. Свойство, которое я проверяю, -

    [ValidatorComposition(CompositionType.And)]
    [SOME Operator("EnabledField")]
    [RegexValidator("\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*", Ruleset = "RuleSetA",
        MessageTemplate = "Invalid Email Address")]
    public String Email_NotificationUser
    {
        get { return _Email_NotificationUser; }
        set
        {
            _Email_NotificationUser = value;
            RaisePropertyChanged("Email_NotificationUser");
        }
    }

Что я не могу понять, как закодировать строку «[SOME Operator («EnabledField»)]». Что я пытаюсь сделать, так это то, что если установлен флажок EnabledField, то проверьте, является ли это поле действительным адресом электронной почты.

Редактировать примечание - Изменено условие с Или на И


person photo_tom    schedule 18.01.2010    source источник


Ответы (1)


Что ж, на мой взгляд, вам понадобится CompositionType.Or и собственный валидатор, который отрицает значение поля bool:

[ValidatorComposition(CompositionType.Or)]
[FalseFieldValidator("EnabledField")]
[RegexValidator("\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*", MessageTemplate = "Invalid Email Address")]
public String Email_NotificationUser { get; set; }

Тогда атрибут упрощенной проверки и логический код будут выглядеть следующим образом:

[AttributeUsage(AttributeTargets.Property)]
public class FalseFieldValidatorAttribute: ValidatorAttribute {

    protected override Validator DoCreateValidator(Type targetType) {
        return new FalseFieldValidator(FieldName);
    }

    protected string FieldName { get; set; }

    public FalseFieldValidatorAttribute(string fieldName) {
        this.FieldName = fieldName;
    }
}

public class FalseFieldValidator: Microsoft.Practices.EnterpriseLibrary.Validation.Validator {
    protected override string DefaultMessageTemplate {
        get { return ""; }
    }

    protected string FieldName { get; set; }

    public FalseFieldValidator(string fieldName) : base(null, null) {
        FieldName = fieldName;
    }

    public override void DoValidate(object objectToValidate, object currentTarget, string key, ValidationResults validationResults) {
        System.Reflection.PropertyInfo propertyInfo = currentTarget.GetType().GetProperty(FieldName);
        if(propertyInfo != null) {
            if((bool)propertyInfo.GetValue(currentTarget, null)) 
                validationResults.AddResult(new Microsoft.Practices.EnterpriseLibrary.Validation.ValidationResult(String.Format("{0} value is True", FieldName), currentTarget, key, null, this));
        }
    }
}

В этом сценарии FalseFieldValidator будет давать сбой всякий раз, когда EnabledField имеет значение true, а условие "ИЛИ" даст RegexValidator шанс сработать.

person Stanislav Kniazev    schedule 18.01.2010
comment
Отличный ответ. Я исправил модификатор доступа для метода DoValidate — он должен быть public, чтобы переопределить базовый метод. - person Kirk Broadhurst; 24.02.2011