如果验证失败,XAML验证的工作原理是什么,不更新CLR属性

时间:2017-11-14 16:10:41

标签: c# wpf validation xaml data-binding

我的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和代码背后的代码进行验证,则没有任何内容。

1 个答案:

答案 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不是。