2012-03-18 4 views
2

Si le moteur de liaison ne peut pas convertir le texte entré dans le type de données de la propriété liée dans DataGridTextColumn (liaison ci-dessous), la cellule reçoit une bordure rouge et vous ne pouvez pas modifier d'autres cellules l'erreur est fixe. La bordure reste même si vous sortez de la cellule.Gestion des exceptions (validation) dans WPF DataGrid

<DataGridTextColumn Binding="{Binding IntegerProperty, UpdateSourceTrigger=PropertyChanged, NotifyOnValidationError=True, ValidatesOnExceptions=True}" /> 

Tout cela est très bien dans ma configuration. Le problème est que si je lance une exception dans un setter de propriétés, le comportement est différent. D'abord, la bordure rouge (erreur de validation) est supprimée immédiatement lorsque je quitte la cellule et je peux continuer à éditer le reste des cellules de la grille.

Est-il possible de faire en sorte que l'exception levée dans l'éditeur de propriétés se comporte de la même manière que la façon dont le moteur de liaison gère les exceptions de format? Le plus grand ennui est que l'erreur de validation est supprimée après avoir quitté la cellule.

Répondre

1

Je pense que vous ne devriez pas lancer une exception dans un setter de propriétés.

Prenez le contrôle de la validation en créant vos propres objets ValidationRules.

Cela pourrait vous aider ou vous pourriez être au-delà de cela. http://www.wpfsharp.com/2012/02/03/how-to-disable-a-button-on-textbox-validationerrors-in-wpf/

Lorsque l'exception se trouve dans l'interface utilisateur, la valeur non valide n'est même pas transmise à la propriété liée.

En outre, vous pouvez gérer l'exception au lieu de simplement la lancer et définir la propriété sur une valeur par défaut ou l'effacer ou quelque chose.

+0

Merci, ValidationRule m'a rapproché de la solution. Maintenant, le comportement est presque le même. Mais toujours l'erreur de validation (j'ai un gestionnaire Validation.Error sur le StackPanel contenant le DataGrid) est supprimée lorsque je quitte l'onglet. Cela ne se produit pas (suppression d'erreur de validation) lorsque le moteur de liaison gère le FormatException. – friskm

0

Il n'y a rien de mal à lancer une exception dans un setter. Après tout, certains setters appellent la validation ou d'autres procédures pendant leur définition. Par exemple, j'ai peut-être une propriété Connected pour une base de données qui tente d'ouvrir une connexion de base de données lorsqu'il est défini sur true. Cela pourrait être réglé sur un bouton bascule sur ma fenêtre wpf. Cela dit, vous pouvez créer un écouteur - quelque chose de similaire à ce lien: http://www.switchonthecode.com/tutorials/wpf-snippet-detecting-binding-errors. Dans mon cas, j'utilise le framework MVVM et Prism/Unity. Une fois que j'ai récupéré la valeur et soit piège une exception ou en soulève une, j'appelle un événement interne dans mon modèle View appelé NotifyViewOfException. Je passe dans l'objet d'exception et il le gère à partir de là en affichant une fenêtre. Vous n'avez pas besoin d'utiliser Prism/Unity pour le faire. D'après votre description, je ne sais pas ce que vous utilisez, donc je n'entrerai pas dans les détails à ce sujet.