2017-03-14 8 views
1

TextBox가 비어있을 때 오류 메시지를 표시하는 간단한 유효성 검사가 있습니다. 문제는 메시지의 첫 번째 문자 만 표시한다는 것입니다. 텍스트 상자의 스타일에서 오류 메시지는 오류 메시지의 첫 번째 문자 만 표시합니다. INotifyDataErrorInfo WPF

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> 

, 어떤 문제없이 모두 보여줍니다.

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

답변

2

귀하의 GetErrors 방법 IEnumerable<char> 대신 IEnumerable<string>을 반환해야합니다.

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

나는 어떤 문제없이 내 텍스트 상자 스타일에 트리거를 시도했습니다, 그리고 툴팁이 제대로 렌더링합니다.

당신이 IDataErrorInfo를 구현하고 IDataErrorInfo 속성에 유효한 문자열을 반환하는 것을 확인하십시오 :

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

내 샘플 프로젝트에 트리거 내 결과 :

My result

+0

INotifyDataErrorInfo를 사용 중입니다. 문자열이 올바른 값을 반환하고 메시지의 첫 번째 문자가 변경되어 툴팁에서 적절히 변경되었습니다. 나는 C# 코드를 포함하도록 질문을 업데이트했다. – IBRA