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

时间:2017-03-14 15:03:04

标签: c# wpf wpf-style inotifydataerrorinfo

我有一个简单的验证,当TextBox为空时显示错误消息。 问题是消息只显示消息的第一个字母。

enter image description here

在TextBox样式中:

<Trigger Property="Validation.HasError" Value="True">
    <Setter Property="ToolTip" Value="{Binding Path=(Validation.Errors)[0].ErrorContent, RelativeSource={x:Static RelativeSource.Self}}" />
</Trigger>

如果我将错误消息直接设置为Setter Value,则会显示所有错误信息。

<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 个答案:

答案 0 :(得分:3)

您的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 };
}

答案 1 :(得分:0)

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

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

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

我的示例项目中触发器的结果:

My result

答案 2 :(得分:0)

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