0

我有以下 WPF-MVVM 设置:

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

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

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

1 回答 1

1

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

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

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

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

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

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

于 2014-01-10T10:18:03.093 回答