C# 何时使用null vs String.empty调用INotifyDataErrorInfo.GetErrors?

C# 何时使用null vs String.empty调用INotifyDataErrorInfo.GetErrors?,c#,.net,wpf,validation,C#,.net,Wpf,Validation,在中,它表示使用一个参数调用GetErrors方法,该参数可以是: 要为其检索错误信息的属性的名称 空的 字符串。空 文档没有说明何时使用null vs String.Empty调用此方法。我已经在我的应用程序中看到了这两种情况,我需要了解何时可以期待其中一种 澄清:我不是在问如何实现GetErrors方法(我只是测试null和empty)。问题是更容易理解为什么WPF框架有时尝试使用null调用此方法,有时尝试使用空字符串调用此方法(我在应用程序中遇到了这两种情况)。如果目的是询问与特定属

在中,它表示使用一个参数调用GetErrors方法,该参数可以是:

  • 要为其检索错误信息的属性的名称
  • 空的
  • 字符串。空
文档没有说明何时使用null vs String.Empty调用此方法。我已经在我的应用程序中看到了这两种情况,我需要了解何时可以期待其中一种


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

当调用方不想知道特定参数的错误,而想知道实体的所有参数的错误时,您必须同时期望
null
string.Empty
。因此,您不应该在
null
string.Empty
之间进行区分

因此,以这种方式:

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

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

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.";
           }
        }
    }
但是,在大多数情况下,当string.IsNullOrEmpty(propertyName)为空时,您可能会返回null。

何时使用null vs string.empty调用INotifyDataErrorInfo.GetErrors

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

RaiseEvent ErrorsChanged(Me, New DataErrorsChangedEventArgs("PropertyName"))
RaiseEvent ErrorsChanged(Me, New DataErrorsChangedEventArgs(String.Empty))
来自该属性的setter

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

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

从一些“中心”位置,如单击保存按钮或关闭窗口。

当绑定未引用任何属性时,您将获得空参数,如默认路径:

DataContext="{Binding ValidatesOnNotifyDataErrors=True}"
DataContext="{Binding Path=., ValidatesOnNotifyDataErrors=True}"
这可以通过在路径中指定实际属性来避免。当然,它可以是视图模型中的一个属性,包括仅返回“this”的属性

至于string.Emtpy,这在内部框架中是明确的:

List propertyErrors=GetDataErrors(indei,propertyName);
List valueErrors=GetDataErrors(dataErrorValue,String.Empty);
列表错误=合并错误(propertyErrors、valueErrors);

警告:请注意上面的聚合操作,因此,如果使用string.IsNullOrEmpty验证框架是否在请求实体级别的错误,并返回相同的错误,而不管“null”与“string.Emtpy”如何,则用户界面中可能会出现重复消息(一个用于“null”,另一个用于string.Empty)。至少在今天的.NET framework发行版中是这样。

简而言之,答案是:你不应该在意。当模式用null调用时,我不会搜索模式,当模式用string.Empty调用时,我不会搜索模式,因为接口描述允许这两种情况。因此,我相信一些microsoft开发人员使用null,其他人使用string.Empty。因此,您将找到实现调用类的组。但这无助于你编写应用程序或类似的东西。我不同意。如果这种行为背后有一个msdn中没有记录的原因,我想了解它,并了解这两种情况之间的区别。如果没有区别,那么应该针对接口实现的框架就有问题,而不是它背后的实现。由于“null”和“string.Empty”都允许询问所有错误,因此将使用这两个变量。我不明白为什么框架会出问题。也许界面设计得不是很好。使用两个函数并禁止将“null”和“string.Empty”作为此函数的值可能会更好。我是否理解您的问题,您的问题是,为什么要区分
null
string.Empty