C#WPF MVVM数据验证

时间:2014-01-10 10:07:25

标签: c# wpf mvvm inotifydataerrorinfo

我遵循WPF-MVVM设置:

  • 使用UpdateSourceTrigger = PropertyChanged绑定到ViewModel属性的2个文本字段的视图和带有绑定到中继命令的命令的按钮(CanExecute,Execute方法)
  • ViewModel,它实现了INotifyDataErrorInfo,其中2个属性使用[System.ComponentModel.DataAnnotations.Required]注释。属性设置器调用私有ViladateProperty方法,该方法将验证结果存储在错误字典中。 HasErrors属性getter检查错误字典以返回适当的值。

目的是在整个表单正确验证后立即启用该按钮。 我的两个问题是:

  • 如何实现按钮中继命令的CanExecute方法,而不是为每个属性更改调用整个模型的验证?
  • “延迟”UpdateSourceTrigger设置相应属性的最佳方法是什么,而不是每次击键,但是,例如,在“无输入”一秒后?

1 个答案:

答案 0 :(得分:1)

您的CanExecute处理程序应该只是引用您的HasErrors属性:

... (canExecute) => !HasErrors; ...
  

•如何实现button relay命令的CanExecute方法,而不是为每个属性更改调用整个模型的验证?

如果在每次击键后都没有检查,你能告诉我房产系统是否可能知道是否有任何验证错误?想一想......任何击键都可能使模型无效。无论哪种方式,您都不会注意到任何延迟,因为它会重新验证模型。

  

•延迟"最好的方法是什么? UpdateSourceTrigger设置相应的属性不是每次击键,但是,例如,在一秒钟之后"没有输入"?

如果您正在使用.NET 4.5,那么您很幸运... Microsoft刚刚向Delay类添加了Binding属性。这使您可以设置在目标上的值更改之后更新绑定源之前等待的时间(以毫秒为单位)。有关完整信息,请参阅MSDN上的BindingBase.Delay Property页面。