2012-05-15 8 views

Répondre

0

Vous avez différentes façons de le faire.

Le plus propre serait d'implémenter IDataErrorInfo dans votre modèle et de définir ValidatesOnDataError=true dans vos fixations. (Et si vous ne savez pas sur IDataErrorInfo, je vous encourage vraiment à prendre le temps de se pencher parce que c'est un outil TRÈS utile et est très facile à utiliser)

Une autre solution alternative, qui nécessite moins de code , mais peut être un peu moins propre:

Vous pouvez simplement ajouter un gestionnaire d'événements à CellEditEnding (ou remplacer DataGrid.OnCellEditEnding) et valider les données entrées avant qu'il ne soit validé. Si la validation échoue, vous venez d'annuler l'événement CellEditEnding.

Voici le code si vous remplacez OnCellEditEnding (ce qui est presque exactement la même chose que le simple ajout d'un gestionnaire d'événements)

Je pris un exemple facile pour vous, ici, je juste essayer d'analyser le texte saisi. Vous pouvez avoir accès au texte saisi par l'utilisateur avec EditingElement propriété d'un DataGridCellEditEndingEventArgs

Voici le code:

protected override void OnCellEditEnding(DataGridCellEditEndingEventArgs e) 
     { 
      try 
      { 
       // Try to parse the text 
       double test = Double.Parse((e.EditingElement as TextBox).Text); 
      } 
      catch (FormatException) 
      { 
       // Mark the current editing element as invalid and cancel the event 
       TextBox text = e.EditingElement as TextBox; 
       BindingExpression bindingExpression = 
        BindingOperations.GetBindingExpression(text, TextBox.TextProperty); 
       BindingExpressionBase bindingExpressionBase = 
        BindingOperations.GetBindingExpressionBase(text, TextBox.TextProperty); 
       ValidationError validationError = 
        new ValidationError(new ExceptionValidationRule(), bindingExpression); 
       Validation.MarkInvalid(bindingExpressionBase, validationError); 
       e.Cancel = true; 
      } 
      base.OnCellEditEnding(e); 
     } 

Hope this était assez clair :)

+0

Merci! La solution alternative a fonctionné. Mais j'utilise aussi le "OnCellEditEnding" pour commettre chaque cellule immédiatement après le transfert vers une autre cellule/quand le DataGrid perd le focus. Si j'utilise ceci, en transférant à une autre cellule il ne commettra pas la dernière cellule. Y a-t-il un moyen de contourner cela? – enlilbinny

+0

Eh bien .. Cela ne me semble pas étrange du tout: vous voulez essentiellement que votre DataGrid empêche la validation de texte non validé. Donc, si vous écrivez un texte invalide et changez de cellule, le comportement normal serait d'éviter de commettre le texte invalide, n'est-ce pas? – Damascus

+0

Oui, c'est vrai. Je vérifie chaque frappe. – enlilbinny

Questions connexes