2017-03-14 1 views
1

Ich habe eine einfache Überprüfung, um eine Fehlermeldung anzuzeigen, wenn eine TextBox leer ist. Das Problem ist mit der Nachricht, die nur den ersten Brief der Nachricht anzeigt.Fehlermeldung zeigt nur das erste Zeichen der Fehlermeldung an. INotifyDataErrorInfo WPF

enter image description here

in der Textbox Stil:

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

Wenn ich die Fehlermeldung direkt an den Setter Wert gesetzt wird, zeigt es alle es ohne Probleme.

<Trigger Property="Validation.HasError" Value="True"> 
    <Setter Property="ToolTip" Value="This field is required!" /> 
</Trigger> 

XAML-Code:

<TextBox Text="{Binding Name, Mode=TwoWay, 
       UpdateSourceTrigger=PropertyChanged, 
       ValidatesOnNotifyDataErrors=True, 
       NotifyOnValidationError=True}" /> 

C# -Code

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(); 
    } 
} 

Antwort

2

Ihre GetErrors Methode

:

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

Mein Ergebnis mit dem Auslöser in meinem Beispielprojekt sollte eine IEnumerable<string> anstelle einer IEnumerable<char>:

zurückgeben
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

Ich habe Ihre Trigger auf meine Textbox Stil ohne Probleme versucht, und Tooltip macht richtig.

Bitte bestätigen Sie, dass Sie IDataErrorInfo und Rückkehr eine gültige Zeichenfolge in Ihrer IDataErrorInfo Eigenschaft implementieren: My result

+0

Ich verwende INotifyDataErrorInfo, und die Zeichenfolge gibt den richtigen Wert zurück, und ich habe den ersten Buchstaben der Nachricht geändert und es in der QuickInfo entsprechend geändert. Ich habe die Frage aktualisiert, um den C# -Code einzubeziehen – IBRA

Verwandte Themen