2017-05-15 8 views
0

enter image description hereWPF - Fody Validar

を使用して、ユーザー入力の検証は、私は上記の画像のようにユーザー入力を検証しようとしています。 Fody Validorライブラリを使用しており、hereの指示に従っています。

妥当性確認が行われていますが、TextBoxの枠線が赤色に変わっていないことがわかります。

私はグーグルで、私はこれに関する情報を得ることができませんでした。 誰かが私に実用的なコード例を教えてもらえますか?

UPDATE

Fody ValidationTemplate(データアノテーション検証)

public class ValidationTemplate :IDataErrorInfo 
    { 

     INotifyPropertyChanged target; 
     ValidationContext validationContext; 
     List<ValidationResult> validationResults; 

     public ValidationTemplate(INotifyPropertyChanged target) 
     { 
      this.target = target; 
      validationContext = new ValidationContext(target, null, null); 
      validationResults = new List<ValidationResult>(); 
      Validator.TryValidateObject(target, validationContext, validationResults, true); 
      target.PropertyChanged += Validate; 
     } 

     void Validate(object sender, PropertyChangedEventArgs e) 
     { 
      validationResults.Clear(); 
      Validator.TryValidateObject(target, validationContext, validationResults, true); 
      var hashSet = new HashSet<string>(validationResults.SelectMany(x => x.MemberNames)); 
      foreach (var error in hashSet) 
      { 
       OnValidate(error); 
      } 
     } 


     private HashSet<string> _errors = new HashSet<string>(); 
     public string this[string columnName] 
     { 
      get 
      { 
       return OnValidate(columnName); 
      } 
     } 

     protected virtual string OnValidate(string propertyName) 
     { 
      string error = string.Empty; 

      try 
      { 
       if (string.IsNullOrEmpty(propertyName)) 
        throw new ArgumentException("Invalid property name", propertyName); 

       var value = this.GetType().GetProperty(propertyName).GetValue(this, null); 
       var results = new List<ValidationResult>(1); 
       var context = new ValidationContext(this, null, null) { MemberName = propertyName }; 
       var result = Validator.TryValidateProperty(value, context, results); 
       if (!result) 
       { 
        var validationResult = results.First(); 
        error = validationResult.ErrorMessage; 
        _errors.Add(propertyName); 
       } 
       else 
       { 
        _errors.Remove(propertyName); 
       } 
      } 
      catch (Exception) { } 

      return error; 
     } 

     public bool HasErrors 
     { 
      get { return _errors.Count > 0; } 
     } 

     public string Error { get; set; } 
    } 

検証するためのモデルクラス:

public class Movie : INotifyPropertyChanged 
    { 
     IDataErrorInfo validationTemplate; 
     public Movie() 
     { 
      validationTemplate = new ValidationTemplate(this); 
     } 

     private int _id; 
     private string _title; 
     public int Id 
     { 
      get { return _id; } 
      set 
      { 
       if (_id != value) 
       { 
        _id = value; 
        OnPropertyChanged("Id"); 
       } 
      } 
     } 

     [Required] 
     [StringLength(30)] 
     [MinLength(3)] 
     public string Title 
     { 
      get { return _title; } 
      set 
      { 
       if (_title != value) 
       { 
        _title = value; 
        OnPropertyChanged("Title"); 
       } 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     protected void OnPropertyChanged(string name) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(name)); 
      } 
     } 
    } 

XAML

<TextBox Text="{Binding Movie.Title, Mode=TwoWay, NotifyOnSourceUpdated=True, NotifyOnTargetUpdated=True, NotifyOnValidationError=True, ValidatesOnNotifyDataErrors=True, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}" /> 
+0

コードを追加してください –

+0

@ S.Petrosovコードを追加して質問を更新しました。 – Rahul

答えて

1

私は調査して問題を発見しました。 FodyWeavers.xmlファイルに以下の設定がありませんでした。私はFody nugetパッケージを更新するとき

<?xml version="1.0" encoding="utf-8" ?> 
<Weavers> 
    <Validar/> 
</Weavers> 

ノード<Validar/>を除去しました。

関連する問題