WPF / MVVM验证

时间:2016-08-24 14:24:23

标签: c# wpf mvvm

这是表示用作IdCard输入的TextBox的XAML代码

  <TextBox.Text>
     <Binding Mode="TwoWay"
              Path="IdCardNumber"
              UpdateSourceTrigger="PropertyChanged">
                 <Binding.ValidationRules>
                    <v:AlphaNumValidationRule ValidationStep="UpdatedValue" />
                 </Binding.ValidationRules>
     </Binding>
  </TextBox.Text>

验证:

public class AlphaNumValidationRule : ValidationRule
{
    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        if (string.IsNullOrWhiteSpace((value ?? "").ToString()))
            return new ValidationResult(false, Resources.Strings.MessagesResource.RequiredField);
        else if (value.ToString().MatchRegex(RegexResource.ALPHANUMERIC))
            return new ValidationResult(true, null);
        else
            return new ValidationResult(false, Resources.Strings.MessagesResource.InvalidFormat);
    }
}

ViewModel

    public override bool IsValid
    {
        get { return !string.IsNullOrWhiteSpace(IdCardNumber); }
    }
    private string idCardNumber;
    public string IdCardNumber
    {
        get { return idCardNumber; }
        set { Set(() => IdCardNumber, ref idCardNumber, value);
            RaisePropertyChanged("IsValid");
        }
    }

我想要的是每次更新IdCard输入时更新IsValid,我尝试了不同的ValidationStep但没有按照我的意愿

首次加载输入时,IsValid为false,当输入正确的值时,在删除输入并添加错误的不支持值后,它变为true IsValid保持不变,因为它保留了最后一个正确的值。

有什么方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

发生绑定错误时会触发附加事件Validation.Error

所以基本上你可以附加到这个事件并将Validation.HasErrors属性的值设置为你的viewmodel的IsValid属性。

但我看到了冲突。您在View中定义了验证逻辑,但是您想在ViewModel中访问它,这就是您遇到麻烦的原因。

我建议您通过实施INotifyDataErrorInfo将整个验证逻辑移动到您的viewmodel。那么您将在viewmodel中拥有所有验证规则和验证错误。

答案 1 :(得分:1)

您可以尝试使用UpdateSourceTrigger更改LostFocus属性:

 <Binding Mode="TwoWay"
          Path="IdCardNumber"
          UpdateSourceTrigger="LostFocus">
             <Binding.ValidationRules>
                <v:AlphaNumValidationRule ValidationStep="UpdatedValue" />
             </Binding.ValidationRules>
 </Binding>

编辑:

要绑定验证结果,您可以使用HasError属性:

   <TextBox Name="TextBox">
            <TextBox.Text>
                <Binding Mode="TwoWay"
              Path="Text"
              UpdateSourceTrigger="PropertyChanged">
                    <Binding.ValidationRules>
                        <local:AlphaNumValidationRule/>
                    </Binding.ValidationRules>
                </Binding>
            </TextBox.Text>
        </TextBox>
   <TextBlock Text="{Binding (Validation.HasError), ElementName=TextBox}"/>