错误消息仅显示错误消息的第一个字符。INotifyDataErrorInfo WPF

3
我有一个简单的验证,当文本框为空时显示错误消息。 问题在于消息只显示第一个字母。

enter image description here

在文本框样式中:
<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();
    }
}
3个回答

5

你的GetErrors方法应该返回一个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 };
}

0

如果在表单中有其他不需要验证的控件,请确保返回空值。确实,已实例化的列表不是空值,如果您在_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 };
}

0

我已经在我的文本框样式上尝试了您的触发器,没有任何问题,并且工具提示正确地呈现。

请确认您正在实现IDataErrorInfo并在您的IDataErrorInfo属性中返回有效的字符串:

        public string this[string columnName]
        {
            get { return ValidateInput(columnName); }
        }

在我的示例项目中使用您的触发器后,我的结果如下:

My result


我正在使用INotifyDataErrorInfo,字符串返回正确的值,并且我已经更改了消息的第一个字母,工具提示中相应地发生了更改。我已更新问题以包括c#代码。 - IBRA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接