【问题标题】:What is the work around for XAML validation not updating the CLR property if validation fails如果验证失败,XAML 验证不更新 CLR 属性的解决方法是什么
【发布时间】:2017-11-14 16:10:40
【问题描述】:

我的 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(显示错误消息等)端以及我的视图模型中的所有值(如果显示错误则防止提交或仅在所有字段都验证后才启用按钮)?

MSDN 的官方数据绑定文档分别涵盖了验证部分,但如果我们想使用相同的验证规则从 UI 和代码背后的角度进行验证,则没有任何内容。

【问题讨论】:

  • ValidationRules 将验证置于视图领域,而视图模型“不知道”它。如果你想让 viewmodel 参与进来,请在 viewmodel 上实现IDataErrorInfo

标签: c# wpf validation xaml data-binding


【解决方案1】:

您应该摆脱视图中的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

【讨论】:

    猜你喜欢
    • 2014-03-01
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    • 2011-08-08
    相关资源
    最近更新 更多