【问题标题】:C# WPF MVVM data validationC# WPF MVVM 数据验证
【发布时间】:2014-01-29 06:03:05
【问题描述】:

我有以下 WPF-MVVM 设置:

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

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

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

【问题讨论】:

    标签: c# wpf mvvm inotifydataerrorinfo


    【解决方案1】:

    您的 CanExecute 处理程序应该简单地引用您的 HasErrors 属性:

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

    •如何实现按钮中继命令的CanExecute方法,而不需要对每次属性更改都调用整个模型的验证?

    如果属性系统在每次击键后没有检查,你能告诉我如何知道是否存在任何验证错误吗?想想看……任何击键都可能使模型无效。无论哪种方式,在重新验证模型时您都不会注意到任何延迟。

    •什么是“延迟”UpdateSourceTrigger 以设置相应属性的最佳方法,而不是在每次击键时,而是在例如“无输入”一秒后?

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

    【讨论】:

    • 感谢第二个问题的回答!关于第一个问题 - 我的 CanExecute 处理程序仅引用您所描述的 HasErrors。关键是验证策略:如果您验证每个属性更改的所有属性,则第二个文本文件(没有输入)一旦第一个变为空就会变得无效,反之亦然。如果您仅验证当前更改的属性,您可以获得无效的表单,因为其他文本字段尚未验证。问题是如何验证所有属性,而无需在每次属性更改时验证这些属性。
    • 我不确定您是如何连接验证的,甚至不确定您是在谈论业务规则验证还是只是数据类型验证,但我根本不操作 UI 控件当数据无效时。我只是让整个表单发红光,并在 UI 的集合中显示确切的错误消息供用户修复。
    • 这是一个更通用的问题:如果您在此属性的更改事件中验证一个属性,何时调用整个表单验证(阅读:每个属性的验证)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    • 2015-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多