【发布时间】:2017-04-18 18:33:25
【问题描述】:
在 WPF 中,典型的验证实现会在属性值更改时进行验证。这提出了一个问题。如果您有一个“必填”字段并且您单击一个按钮,则用户在单击该按钮时不会被提醒为空。由于值没有改变,因此不会发生验证。
在线有很多方法可以通过这些方法在代码隐藏中、在基本视图模型等上显式执行验证。但是我对 Microsoft 提出的解决方案感兴趣。特别是这适用于我当前使用的 Microsoft 企业库中的验证应用程序块。 Microsoft 在此处推荐最佳实践方法: https://msdn.microsoft.com/en-us/library/ff664451(v=pandp.50).aspx
他们特别指出:
如果带有必需验证属性的已验证控件的值一开始是空的,并且在验证期间保持为空,则源不会更新并且不会发生验证。在这种特殊情况下,ValidateOnTargetUpdate 属性也将不起作用,因为目标的 null 默认值不会更改。相反,您可以在绑定上调用 UpdateSource 以强制进行验证,如下所示:
this.Required.GetBindingExpression(TextBox.TextProperty).UpdateSource();
验证规则在 ConvertedProposedValue 步骤中运行,在值转换之后但在源上设置之前。这意味着必须通过其他机制来检测价值转换错误。一种方法是在经过验证的绑定上启用 ValidatesOnDataErrors 属性。
很遗憾,我无法理解这一点。我在哪里调用 UpdateSource 方法? this 在微软的 sn-p 中指的是哪个对象?我假设我需要在某处拦截绑定,但我不确定。
【问题讨论】:
-
您的
Window类将不需要该功能,因此如果您在MainWindow.xaml.cs中键入它,它将为您提供GetBindingExpression功能。这也适用于任何Controls。
标签: c# wpf validation enterprise-library