2017-04-18 45 views
0

在WPF中,典型的验证实现在属性值更改时进行验证。这提出了一个问题。如果您有“必填”字段,并且您单击某个按钮,则用户在点击按钮时不会收到空的提醒。由于该值没有变化,验证不会发生。何时调用Required.GetBindingExpression验证企业库的验证块的空字段

有许多方法可以在线执行此验证,在代码隐藏,基础视图模型等中明确执行验证。但是,我对Microsoft提出的解决方案感兴趣。特别是,这适用于我目前使用的Microsoft企业库中的验证应用程序块。 Microsoft建议的最佳实践方法,在这里: https://msdn.microsoft.com/en-us/library/ff664451(v=pandp.50).aspx

特别是他们的状态:

如果验证控制携带必需的验证属性是空的,首先,和验证过程中保持为空值,源不会更新并且不会进行验证。在这种特殊情况下,ValidateOnTargetUpdate属性不起作用,因为目标的空默认值不会改变。相反,你可以在绑定调用UpdateSource强制验证发生,如下所示:

this.Required.GetBindingExpression(TextBox.TextProperty).UpdateSource(); 

的验证规则在ConvertedProposedValue步骤进行操作,该值已经被转换之后,但在它被设置来源。这意味着价值转换错误必须通过其他机制来检测。一种方法是在验证的绑定上启用ValidatesOnDataErrors属性。

不幸的是,我无法理解这一点。我在哪里调用UpdateSource方法? this在微软的代码片段中提及哪个对象?我假设我需要做一些事情,比如拦截某个地方的绑定,但我不确定。

+0

你的'Window'类没有要求就会有这个功能,所以如果你在'MainWindow.xaml.cs'中输入它,它会给你'GetBindingExpression'函数。这也可以在任何'Controls'中使用。 – XAMlMAX

回答

0

我想通了。正如评论部分所述,我们可以在窗口或任何控件中访问GetBindingExpression。我相信微软的意图是,Required是一个控件的样本名称,而this指的是Window的代码隐藏或任何其他控件,如Window,它有一个代码隐藏。

此外,提高其他地方的其他验证结构提出了PropertyChanged事件(例如,当开发商已经实现IDataErrorInfo的)似乎并不在微软企业库的验证模块相同的效果。验证不会通过简单地在控件上引发PropertyChanged事件而重新发生。这不是特定于必填字段。相反,Microsoft建议在控件上执行UpdateSource,尽管参考了必填字段。

这里How to invoke UpdateSource for all bindings on the form?是如何在所有元素上实现UpdateSource的示例。