使用Regex无法正常工作的DataValidation

时间:2015-05-29 19:08:38

标签: c# regex wpf xaml validation

所以我有一个MaskedTextInput框,如下所示:

<telerik:RadMaskedTextInput Margin="2" BorderBrush="LightGray"
                            IsClearButtonVisible="False"
                            Mask="(###) ###-####"
                            UpdateValueEvent="PropertyChanged"
                            TextMode="PlainText"
                            Value="{Binding Path=PhoneNumber, 
                                            Mode=TwoWay, 
                                            NotifyOnValidationError=True, 
                                            ValidatesOnExceptions=True,
                                            UpdateSourceTrigger=PropertyChanged}" />

并通过ViewModel绑定以下代码隐藏:

//Phone Number
[Required(AllowEmptyStrings = false, ErrorMessage = @"A phone number is required.")]
[RegularExpression(@"^\d{10}$", ErrorMessage = @"Invalid phone number.")]
public string PhoneNumber
{
    get { return _phoneNumber; }
    set
    {
        if (_phoneNumber!= value)
        {
            Validator.ValidateProperty(value, 
                new ValidationContext(this, null, null)
                {
                    MemberName = "PhoneNumber"
                });
            _phoneNumber = value;
            OnPropertyChanged("PhoneNumber");
        }
    }
}

我试图做的是当用户有10位数以外的任何内容时抛出异常导致边框变红。

它适用于其他字段,例如电子邮件地址,但由于某种原因,它不适用于带有掩码设置的电话号码字段。

2 个答案:

答案 0 :(得分:0)

根据telerik的documentation,您需要在set语句中抛出异常。

set
{
    if (_phoneNumber!= value)
    {
        // Do the validation and throw an validation exception.
        if(/*validation statements*/)
        {
          throw new ValidationException("........Error message..........");
        }
        _phoneNumber = value;
        OnPropertyChanged("PhoneNumber");
    }
}

答案 1 :(得分:0)

要实现所需的响应,我需要将MaskedTextInput的AllowInvalidValues属性设置为true:

<telerik:RadMaskedTextInput   AllowInvalidValues="True" .../>

这确保即使DataAnnotaion Validation不成功也会触发属性的Setter - 在我的情况下,当用户开始输入直到他们输入所有10位数字时,将显示错误消息。