何时使用 null 与 String.empty 调用 INotifyDataErrorInfo.GetErrors

本文关键字:调用 INotifyDataErrorInfo GetErrors empty String null 何时使 | 更新日期: 2023-09-27 18:31:57

在 InotifyDataErrorInfo.GetErrors 的 msdn 页面中,它说 GetErrors 方法被调用,参数可以是:

  • 我们要为其检索错误信息的属性的名称
  • 字符串.空

文档没有说明何时使用 null 与 String.Empty 调用此方法。我已经在我的应用程序中看到了这两种情况,我需要了解何时可以期待一种或另一种情况。

澄清:我不是在问我应该如何实现 GetErrors 方法(我只是测试空和空)。问题更多的是理解为什么 WPF 框架尝试调用此方法有时使用 null,有时使用空字符串(我在我的应用程序中遇到了这两种情况)。如果目的是请求与特定属性无关的错误,那么当只有一个值就足够时,为什么要对调用使用两个不同的值?

何时使用 null 与 String.empty 调用 INotifyDataErrorInfo.GetErrors

当调用方想要知道的不是特定参数的错误而是实体的所有参数的错误时,您必须同时nullstring.Empty。所以你不应该在nullstring.Empty之间做出区分。

所以这样的东西:

if(string.IsNullOrEmpty(propertyName))
{
    // return all errors
}
else
{
    // return the error for the parameter 'propertyName'
}

WPF 调用 InotifyDataErrorInfo.GetErrors(null/string.空)以获取"整个视图模型"的错误。具有数据上下文或绑定到具有"整个视图模型错误"的视图模型的所有控件都将使用错误模板呈现。例如,您具有具有两个属性的视图模型凭据:用户名、密码。你可以实现这样的东西:

IEnumerable InotifyDataErrorInfo.GetErrors(string propertyName)
    {
        if (UserNames.Length == 0)
        {
            if (string.IsNullOrEmpty(propertyName))
            {
                return "Some credentials component is wrong.";
            }
            else if (propertyName == "UserNames")
            {
                return "User name is required field.";
           }
        }
    }

但是,在大多数情况下,当字符串时,您可能会返回 null。IsNullOrEmpty(propertyName)。

当绑定引用 no 属性时,你会得到 null 参数,就像默认的 Path 一样:

DataContext="{Binding ValidatesOnNotifyDataErrors=True}"
DataContext="{Binding Path=., ValidatesOnNotifyDataErrors=True}"

这可以通过在 Path 中指定实际属性来避免。当然,它可以是视图模型中的一个属性,包括一个只返回"this"的属性。

Tag="{Binding Path=DataContext, RelativeSource={RelativeSource Self}, ValidatesOnNotifyDataErrors=True}"

至于字符串。Emtpy,这在内部 BindingExpression .UpdateNotifyDataErrors 方法的框架中是显式的:

List<object> propertyErrors = GetDataErrors(indei, propertyName);
List<object> valueErrors = GetDataErrors(dataErrorValue, String.Empty);
List<object> errors = MergeErrors(propertyErrors, valueErrors);

警告:请注意上面的聚合操作,因此如果您使用字符串。IsNullOrEmpty,用于验证框架是否请求实体级错误,并返回相同的错误,而不考虑"null"与字符串。Emtpy,您最终可能会在 UI 中收到重复的消息(一个用于"null",另一个用于字符串。空)。至少在今天的.NET框架版本中是这样。

什么时候用null vs String.empty调用INotifyDataErrorInfo.GetErrors?

如果要验证单个属性,将调用

RaiseEvent ErrorsChanged(Me, New DataErrorsChangedEventArgs("PropertyName"))

从该属性的二传手。

如果要验证整个实体,将调用

RaiseEvent ErrorsChanged(Me, New DataErrorsChangedEventArgs(String.Empty))

从某个"中心"位置,例如"保存"按钮单击或窗口关闭。