2009-11-11 7 views
1

J'essaie de faire une simple validation sur la zone de texte, c'est un champ obligatoire et ne peut pas être vide. Initialement, la valeur sera vide, donc lorsque l'utilisateur n'entre pas de valeur dans le champ et clique directement sur le bouton Enregistrer, la valeur n'est pas déclenchée. Il fonctionne correctement lorsque l'utilisateur saisit quelque chose, puis supprime la valeur, puis il fonctionne parfaitement et affiche le message d'erreur de validation. Y at-il de toute façon à effectuer une vérification de validation après que l'utilisateur clique sur le bouton de sauvegarde.L'exception de validation échoue si le champ est vide Silverlight

[Display(Name = "Sometext", Description = "Some text")] 
    [Required(ErrorMessage = "Required Field")] 
    public string SomeText 
    { 
     get 
     { 
      return _someText; 
     } 
     set 
     { 
      if (_someText== value && 
       value != string.Empty) 
      { 
       return; 
      } 

      Validate(value, "someText");//This calls Validator.ValidateProperty method 
      _someText= value; 
      FirePropertyChanged("someText"); 
     } 
    } 

Veuillez nous suggérer!

Merci à l'avance Sai

Répondre

1

Vous pouvez également faire appel à l'exécution de votre commande

Validator.ValidateObject(this, new ValidationContext(this,null,null),true); 

Cela devrait valider toutes les propriétés de votre viewmodel, en supposant appeler cela de votre viewmodel

edit: Réponse au commentaire

Vous pourriez avoir un propriété comme si (ci-dessous) dans votre BaseViewModel (tous les viewmodel étend BaseViewModel), puis interdire, sauf avec un message approprié

protected bool HasValidationErrors 
     { 
      get 
      { 
       try { 
         Validator.ValidateObject(this, new ValidationContext(this, null, null), true); 
         return false; 
        } 
       catch (ValidationException) { return true; } 

      } 
     } 

Dans votre commande vous appelleriez comme si

public void SaveCommandExecuted(object parameter) 
    { 

     if (HasValidationErrors) 
     { 
      ShowValidationError(); 
     } 
    } 

Une autre chose, vous pouvez essayer est de lier l'événement Affichage des erreurs de validation à un auditeur en vous viewmodel

MyProgram.ViewModels.BaseViewModel baseViewModel = page.Resources["DataSource"] as MyProgram.ViewModels.BaseViewModel; 

    page.BindingValidationError += new EventHandler<ValidationErrorEventArgs>(baseModel.OnValidationError); 

puis dans votre BaseViewModel

private ObservableCollection<ValidationError> Errors { get; set; } 


public void OnValidationError(object sender, ValidationErrorEventArgs e) 
     { 
      switch (e.Action) 
      { 
       case ValidationErrorEventAction.Added: 
        Errors.Add(e.Error); 
        break; 
       case ValidationErrorEventAction.Removed: 
        Errors.Remove(e.Error); 
        break; 
       default: 
        break; 
      } 
     } 

modifier puis HasValidationErrors à

protected bool HasValidationErrors 
     { 
      get 
      { 
       try { 
         Validator.ValidateObject(this, new ValidationContext(this, null, null), true); 
         return this.Errors.Count != 0; 
        } 
       catch (ValidationException) { return true; } 

      } 
     } 
+0

Oui, qui validera toutes les propriétés mais ne propage pas l'exception de validation à l'interface utilisateur. à la place, il lèvera une exception. – Sai

+1

Au lieu d'intercepter l'exception, vous pouvez utiliser TryValidateObject() – Aligned

Questions connexes