在msdn page for InotifyDataErrorInfo.GetErrors中,它表示使用参数调用GetErrors方法,该参数可以是:
文档没有说明何时使用null vs String.Empty调用此方法。我在我的应用程序中看到了这两种情况,我需要了解何时我可以期待其中一种情况。
澄清:我不是要求关于我应该如何实现GetErrors方法(我只是测试null和empty)。问题更多的是要理解为什么 WPF框架有时会尝试使用null调用此方法,有时使用空字符串(我在我的应用程序中遇到了两种情况)。如果目的是要求与特定属性无关的错误,为什么只有一个足够的时候才能使用两个不同的值来调用?
答案 0 :(得分:1)
当调用者想要知道特定参数的错误而不知道实体的所有参数的错误时,您必须同时null
和string.Empty
。因此,您不应该在null
和string.Empty
之间有所作为。
就这样:
if(string.IsNullOrEmpty(propertyName))
{
// return all errors
}
else
{
// return the error for the parameter 'propertyName'
}
答案 1 :(得分:1)
WPF调用InotifyDataErrorInfo.GetErrors(null / string.Empty)来获取“整个视图模型”的错误。具有数据上下文或绑定到具有“整个视图模型错误”的视图模型的所有控件将使用错误模板呈现。例如,您具有两个属性的视图模型凭据:UserName,Password。 你可以实现这样的东西:
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。
答案 2 :(得分:0)
何时使用null vs String.empty调用INotifyDataErrorInfo.GetErrors?
如果您想验证单一财产,请致电
RaiseEvent ErrorsChanged(Me, New DataErrorsChangedEventArgs("PropertyName"))
来自该属性的setter。
如果您想验证整个实体,请致电
RaiseEvent ErrorsChanged(Me, New DataErrorsChangedEventArgs(String.Empty))
来自某个“中心”位置,例如“保存”按钮单击或“窗口关闭”。
答案 3 :(得分:0)
当绑定不引用任何属性时,您将获得null参数,例如默认路径:
DataContext="{Binding ValidatesOnNotifyDataErrors=True}"
DataContext="{Binding Path=., ValidatesOnNotifyDataErrors=True}"
可以通过在Path中指定实际属性来避免这种情况。当然,它可以是视图模型中的一个属性,包括一个仅返回“ this”的属性。
Tag="{Binding Path=DataContext, RelativeSource={RelativeSource Self}, ValidatesOnNotifyDataErrors=True}"
对于string.Emtpy,在内部BindingExpression.UpdateNotifyDataErrors method的框架中是明确的:
List<object> propertyErrors = GetDataErrors(indei, propertyName);
List<object> valueErrors = GetDataErrors(dataErrorValue, String.Empty);
List<object> errors = MergeErrors(propertyErrors, valueErrors);
警告:请注意上面的聚合操作,因此,如果您使用string.IsNullOrEmpty来验证框架是否要求实体级错误并返回相同的错误,而不管“ null”还是字符串.Emtpy,您最终可能会在UI中收到重复消息(一个消息为“ null”,另一个消息为string.Empty)。至少在当今的.NET Framework版本中。