【问题标题】:Where to call Required.GetBindingExpression when validating empty fields for Enterprise Library's Validation Block验证企业库的验证块的空字段时在哪里调用Required.GetBindingExpression
【发布时间】: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


【解决方案1】:

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

此外,引发PropertyChanged 事件,如其他地方建议的其他验证构造(例如当开发人员实现 IDataErrorInfo 时)在 Microsoft 企业库的验证块中似乎没有相同的效果。验证不会通过简单地在控件上引发 PropertyChanged 事件来重新发生。这并不特定于必填字段。相反,微软建议在控件上执行UpdateSource,尽管参考必填字段。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 2012-12-05
    • 1970-01-01
    相关资源
    最近更新 更多