2017-03-14 3 views
1

TextBoxが空のときにエラーメッセージを表示する単純な検証があります。 問題は、メッセージの最初の文字のみを表示していることです。 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

関連する問題