我的xaml代码:
<StackPanel>
<TextBox>
<TextBox.Text>
<Binding Path="ContactNumber"
UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<validators:ContactValidation ValidatesOnTargetUpdated = "True" />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
<Button Command="{Binding SaveContact}"/>
我的视图模型(已经实现了Inotify Fody Weaver,ICommand的标准中继命令实现)
public class DemoVM{
public string ContactNumber{get;set;}
public ICommand SaveContact=new RelayCommand(()=> //Simulate Db save of (ContactNumber));
}
我的验证课
public class ContactValidation : ValidationRule
{
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
if (//some regex match)
return ValidationResult.ValidResult;
else
return new ValidationResult(false,"Error message")
}
}
每次验证规则返回有效结果时,都会更新ContactNumber属性。验证规则返回无效结果时,ContactNumber属性是其最后验证的值。 如何继续验证xaml(显示错误消息等)方面以及我的viewmodel中的所有值(如果所有字段都经过验证,则仅在错误显示或启用按钮时阻止提交)?
MSDN的官方数据绑定文档单独涵盖了验证部分,如果我们想要使用相同的验证规则从UI和代码背后的代码进行验证,则没有任何内容。
答案 0 :(得分:0)
您应该删除视图中的ValidationRules
并在视图模型中实现验证逻辑。
这是通过实现INotifyDataErrorInfo
接口完成的。按照以下TechNet文章中的建议,在您的设置器中验证您的数据。
WPF 4.5:使用INotifyDataErrorInfo接口验证数据: https://social.technet.microsoft.com/wiki/contents/articles/19490.wpf-4-5-validating-data-in-using-the-inotifydataerrorinfo-interface.aspx
这是实现数据验证的MVVM方式。使用ValidationRule
不是。