错误消息仅显示错误消息中的第一个字符。 INotifyDataErrorInfo WPF
Error message displays only the first character from the error message. INotifyDataErrorInfo WPF
我有一个简单的验证来在 TextBox 为空时显示一条错误消息。
问题在于消息只显示消息的 第一个 字母。
在文本框样式中:
<Trigger Property="Validation.HasError" Value="True">
<Setter Property="ToolTip" Value="{Binding Path=(Validation.Errors)[0].ErrorContent, RelativeSource={x:Static RelativeSource.Self}}" />
</Trigger>
如果我直接将错误消息设置为 Setter 值,它会毫无问题地显示所有内容。
<Trigger Property="Validation.HasError" Value="True">
<Setter Property="ToolTip" Value="This field is required!" />
</Trigger>
XAML代码:
<TextBox Text="{Binding Name, Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged,
ValidatesOnNotifyDataErrors=True,
NotifyOnValidationError=True}" />
C#代码
private readonly Dictionary<string, string> _errors = new Dictionary<string, string>();
private readonly object _lock = new object();
public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;
public IEnumerable GetErrors(string propertyName)
{
string errorsForName;
lock (_lock)
{
errorsForName = _errors.FirstOrDefault(e => e.Key == propertyName).Value;//.TryGetValue(propertyName, out errorsForName);
}
return errorsForName;
}
public bool HasErrors
{
get { return _errors.Values.FirstOrDefault(l => !String.IsNullOrEmpty(l)) != null; }
}
private void RaiseErrorsChanged(string propertyName)
{
EventHandler<DataErrorsChangedEventArgs> handler = ErrorsChanged;
if (handler == null) return;
var arg = new DataErrorsChangedEventArgs(propertyName);
handler.Invoke(this, arg);
}
private void RequiredValidation(string propertyName, string value)
{
lock (_lock)
{
if (String.IsNullOrWhiteSpace(value))
{
_errors[propertyName] = "The name can't be null or empty.";
}
else
{
if (_errors.ContainsKey(propertyName)) { _errors.Remove(propertyName); }
}
RaiseErrorsChanged(propertyName);
SaveCommand.RaiseCanExecuteChanged();
}
}
我已经在我的文本框样式上尝试了您的触发器,没有任何问题,并且工具提示正确呈现。
请确认您正在实施 IDataErrorInfo 并在 IDataErrorInfo 中返回有效字符串 属性:
public string this[string columnName]
{
get { return ValidateInput(columnName); }
}
我在示例项目中使用触发器的结果:
您的 GetErrors
方法应该 return 一个 IEnumerable<string>
而不是 IEnumerable<char>
:
public IEnumerable GetErrors(string propertyName)
{
string errorsForName;
lock (_lock)
{
errorsForName = _errors.FirstOrDefault(e => e.Key == propertyName).Value;//.TryGetValue(propertyName, out errorsForName);
}
return new List<string> { errorsForName };
}
如果您的表单中有其他不需要验证的控件,请确保 return 为空值。事实上,一个实例化的列表不是空的,如果你在你的 _errors 字典中有东西的时候点击它,将导致在控件上显示一个红色边框,这些边框没有被验证
public IEnumerable GetErrors(string propertyName)
{
string errorsForName;
lock (_lock)
{
errorsForName = _errors.FirstOrDefault(e => e.Key == propertyName).Value;//.TryGetValue(propertyName, out errorsForName);
}
if (String.IsNullOrEmpty(errorsForName)) return null;
return new List<string> { errorsForName };
}
我有一个简单的验证来在 TextBox 为空时显示一条错误消息。 问题在于消息只显示消息的 第一个 字母。
在文本框样式中:
<Trigger Property="Validation.HasError" Value="True">
<Setter Property="ToolTip" Value="{Binding Path=(Validation.Errors)[0].ErrorContent, RelativeSource={x:Static RelativeSource.Self}}" />
</Trigger>
如果我直接将错误消息设置为 Setter 值,它会毫无问题地显示所有内容。
<Trigger Property="Validation.HasError" Value="True">
<Setter Property="ToolTip" Value="This field is required!" />
</Trigger>
XAML代码:
<TextBox Text="{Binding Name, Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged,
ValidatesOnNotifyDataErrors=True,
NotifyOnValidationError=True}" />
C#代码
private readonly Dictionary<string, string> _errors = new Dictionary<string, string>();
private readonly object _lock = new object();
public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;
public IEnumerable GetErrors(string propertyName)
{
string errorsForName;
lock (_lock)
{
errorsForName = _errors.FirstOrDefault(e => e.Key == propertyName).Value;//.TryGetValue(propertyName, out errorsForName);
}
return errorsForName;
}
public bool HasErrors
{
get { return _errors.Values.FirstOrDefault(l => !String.IsNullOrEmpty(l)) != null; }
}
private void RaiseErrorsChanged(string propertyName)
{
EventHandler<DataErrorsChangedEventArgs> handler = ErrorsChanged;
if (handler == null) return;
var arg = new DataErrorsChangedEventArgs(propertyName);
handler.Invoke(this, arg);
}
private void RequiredValidation(string propertyName, string value)
{
lock (_lock)
{
if (String.IsNullOrWhiteSpace(value))
{
_errors[propertyName] = "The name can't be null or empty.";
}
else
{
if (_errors.ContainsKey(propertyName)) { _errors.Remove(propertyName); }
}
RaiseErrorsChanged(propertyName);
SaveCommand.RaiseCanExecuteChanged();
}
}
我已经在我的文本框样式上尝试了您的触发器,没有任何问题,并且工具提示正确呈现。
请确认您正在实施 IDataErrorInfo 并在 IDataErrorInfo 中返回有效字符串 属性:
public string this[string columnName]
{
get { return ValidateInput(columnName); }
}
我在示例项目中使用触发器的结果:
您的 GetErrors
方法应该 return 一个 IEnumerable<string>
而不是 IEnumerable<char>
:
public IEnumerable GetErrors(string propertyName)
{
string errorsForName;
lock (_lock)
{
errorsForName = _errors.FirstOrDefault(e => e.Key == propertyName).Value;//.TryGetValue(propertyName, out errorsForName);
}
return new List<string> { errorsForName };
}
如果您的表单中有其他不需要验证的控件,请确保 return 为空值。事实上,一个实例化的列表不是空的,如果你在你的 _errors 字典中有东西的时候点击它,将导致在控件上显示一个红色边框,这些边框没有被验证
public IEnumerable GetErrors(string propertyName)
{
string errorsForName;
lock (_lock)
{
errorsForName = _errors.FirstOrDefault(e => e.Key == propertyName).Value;//.TryGetValue(propertyName, out errorsForName);
}
if (String.IsNullOrEmpty(errorsForName)) return null;
return new List<string> { errorsForName };
}