Stéphane Goudeau m'a remonté un lien ce matin : Un nouveau billet vient de sortir, qui présente une nouvelle fonctionnalité du 3.5 SP1 : la validation des données en WPF à l'aide du concept "BindingGroups" : "WPF 3.5 SP1 Feature: BindingGroups with Item-level Validation".

Pour être honnête, je trouve le concept relativement complexe. D'après l'auteur, l'intérêt réside dans le cas par exemple de l'édition d'une ligne d'un datagrid : on peut gérer de façon très fine l'état de la validation d'un objet, grâce entre autre aux évènements BeginEdit, CancelEdit, EndEdit et CommitEdit.

L'auteur l'explique mieux que moi :

"With the WPF CTP DataGrid you are able to open a row for edit (F2) and commit that data (ENTER).  While you can add property level validation to all your bindings and set the ValidatesOnDataError property, when a validation rule fails on commit, you as the app author will have to handle all the rest of the values in the row that have already been committed.  Since the row has already been committed, IEditableObject.EndEdit will have already been called which may clear your cache of row data to revert back to.  With BindingGroups, the app author just needs to provide a item-level validation rule and when that validation rule fails on commit, the app author does not have to write more custom code to get the behavior to either revert back or keep the current state without committing. (Note: row validation is actually not implemented yet in the CTP even if it says it is)"

En parallèle, un autre blog poste le détail d'une solution de validation des données, toujours en utilisant le BindingGroup  et en proposant un pattern perso.

Ce qui me choque un peu, c'est qu'il semblerait qu'on s'éloigne de l'idée d'une validation des données contenue dans la couche métier, et qu'il y aie du coup un couplage avec la couche UI. Ce qui n'est pas vraiment propre...

En ce qui me concerne, je trouve quand même tout celà très peu intuitif. Je préférais franchement l'approche de Karl Shifflett. Quoi qu'il en soit, pour le moment il y a encore trop peu d'information sur les BindingGroups, ce qui j'espère changera bientôt (edit 11 septembre : un nouvel article est sortit sur ce blog. Manque de bol, je n'arrive pas à faire tourner les exemples).

Pour finir de rationaliser ce sujet, je vais faire un parallèle avec le Validation Application Block, des Enterprise Library. Ce framework de validation fournit par Microsoft (et qui est la base de l'exemple posté par Karl Shifflett) fonctionne pour Winform, ASP.Net, mais pas directement pour WPF, qui n'a pas été intégré. Qu'à celà ne tienne. Martin Bennedick a sortit une intégration pour WPF, via un adaptateur. WPF integration for VAB for Enterprise Library 4.0  permet d'avoir la logique coté métier aussi. Un petit exemple :

[StringLengthValidator(1, 50, Ruleset = "RuleSetA", MessageTemplate = "Last Name must be between 1 and 50 characters")]
public string LastName
{
get { return lastName; }
set { lastName = value; }
}

Celà laisse une autre alternative. Car, sinon, il n'y avait à ma connaissance que la solution de Paul Stovell, qui construit un framework perso au dessus de IDataErrorInfo. Validation in WPF

Cependant, c'est une approche procédurale et non pas déclarative.

Et vous, quel est votre avis sur toutes ces approches ?

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :