这是表示用作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保持不变,因为它保留了最后一个正确的值。
有什么方法可以解决这个问题吗?
答案 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}"/>