Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Thomas Lebrun

Tout sur WPF, LINQ, C# et .NET en général !

Actualités

[WPF] Comment mettre à jour plusieurs sources de biding en un seul clic ?

Le binding WPF est très puissant: il permet d'utiliser des règles métier pour valider les données saisies par l'utilisateur puis de vérifier, en un clic, si ces données sont toujours valides.

Cependant, il y a un petit problème: il est nécessaire de valider chacune des entrées de l'utilisateur une à une:

var beFirstName = this.tbFirstName.GetBindingExpression(TextBox.TextProperty);

var beLastName = this.tbLastName.GetBindingExpression(TextBox.TextProperty);

var beEmail = this.tbEmail.GetBindingExpression(TextBox.TextProperty);

 

if (beFirstName != null && beLastName != null && beEmail != null)

{

    beFirstName.UpdateSource();

    beLastName.UpdateSource();

    beEmail.UpdateSource();

 

    if (beFirstName.HasError || beLastName.HasError || beEmail.HasError)

    {

        MessageBox.Show("L'un des champs contient une erreur !");

    }

}

Lorsqu'il n'y a que 2 ou 3 TextBox, cela peut passer mais dans des formulaires comportant une dizaine (voir plus) de zone de saisie, cela peut vite se retrouver laborieux.

Heureusement, le SP1 du Framework .NET 3.5 apporte une nouveauté à ce niveau: les BindingGroups, dont Elise a déjà parlé ici (Elise, toi qui voulait un exemple concret de cette fonctionnalité, en voici un Wink)

Au niveau de l'élément parent, dans le XAML, il convient de déclarer un BindingGroup et de lui affecter une règle de validation:

<Canvas.BindingGroup>

    <BindingGroup Name="CustomerValidationBindingGroup">

        <BindingGroup.ValidationRules>

            <local:StringIsEmptyValidationRule ErrorMessage="Le champ ne peut pas être vide !" />

        </BindingGroup.ValidationRules>

    </BindingGroup>

</Canvas.BindingGroup>

Ensuite, dans le binding, il faut faire référence au BindingGroup nouvellement créé (via la propriété BindingGroupName):

<TextBox x:Name="tbFirstName"

         Text="{Binding Path=FirstName, UpdateSourceTrigger=Explicit, BindingGroupName=CustomerValidationBindingGroup}"

         Width="100"

         Canvas.Left="5"

         Canvas.Top="5" />

 

<TextBox x:Name="tbLastName"

         Text="{Binding Path=LastName, UpdateSourceTrigger=Explicit, BindingGroupName=CustomerValidationBindingGroup}"

         Width="100"

         Canvas.Left="5"

         Canvas.Top="35" />

 

<TextBox x:Name="tbEmail"

         Text="{Binding Path=Email, UpdateSourceTrigger=Explicit, BindingGroupName=CustomerValidationBindingGroup}"

         Width="100"

         Canvas.Left="5"

         Canvas.Top="70" />

Enfin, sur le clic du bouton, un simple appel à la méthide UpdateSources du BindingGroup suffit à faire l'affaire:

this.canvas.BindingGroup.UpdateSources();

Bien sur, pour que cela fonctionne, il est nécessaire de modifier le code de la règle métier:

public override ValidationResult Validate(object value, CultureInfo cultureInfo)

{

    var result = new ValidationResult(true, null);

 

    BindingGroup bindingGroup = (BindingGroup)value;

    Customer customer = (Customer)bindingGroup.Items[0];

 

    var lastName = Convert.ToString(bindingGroup.GetValue(customer, "LastName"));

    var firstName = Convert.ToString(bindingGroup.GetValue(customer, "FirstName"));

    var email = Convert.ToString(bindingGroup.GetValue(customer, "Email"));

 

    if (string.IsNullOrEmpty(lastName) || string.IsNullOrEmpty(firstName) || string.IsNullOrEmpty(email))

    {

        result = new ValidationResult(false, this.ErrorMessage);

    }

 

    return result;

}

L'avantage de cette technique est que l'on est découplé de l'interface utilisateur: la validation des données peut bien se faire dans la couche métier  !

 

Voila, en espérant que cela vous aide à y voir plus clair !

 

A+

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 :
Posted: mardi 9 septembre 2008 09:26 par Thomas LEBRUN
Classé sous : ,

Commentaires

romain verdier a dit :

La couche métier, c'est la méthode Validate ?

# septembre 9, 2008 11:11

Thomas LEBRUN a dit :

Dans l'exemple ci-dessus, oui. Mais après, cela dépend des cas ;)

# septembre 9, 2008 11:31

richardc a dit :

A bas les var,

Les var à la poubelle,

j'aime pâs les var

bouh, y'a des var

oh l'est aps bô le var

;-)))

# septembre 9, 2008 12:44

Thomas LEBRUN a dit :

@Richard: Non, vive le var :) En plus, il est correctement utilisé:

http://community.bartdesmet.net/blogs/bart/archive/2008/08/23/appropriate-use-of-local-variable-type-inference.aspx

=&gt; "Do use type inference... when the right-hand side explicitly states the type or the type is clearly inferable by humans given the context" :)

# septembre 9, 2008 13:04
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Office 365: Comment exporter tous les comptes Azure Active Directory ayant une license via PowerShell par Blog Technique de Romelard Fabrice le 05-17-2018, 13:46

- PowerShell: Comment avoir le Country Name depuis un Country Code par Blog Technique de Romelard Fabrice le 05-17-2018, 13:20

- Office 365: Comment supprimer un compte externe d’un site SharePoint Online en mode Extranet par Blog Technique de Romelard Fabrice le 05-11-2018, 17:00

- Office 365: Comment reconfigurer le lien “Bloc-notes” d’un teamsite par Blog Technique de Romelard Fabrice le 05-09-2018, 16:45

- Office 365: Utiliser l’option “Alert Me” de la page de résultat de recherche par Blog Technique de Romelard Fabrice le 05-09-2018, 14:57

- Office 365: Comment télécharger l’image de profil de Delve par Blog Technique de Romelard Fabrice le 05-09-2018, 14:28

- Office 365: Valeur “Country or Region” et “User Location” dans Azure AD par Blog Technique de Romelard Fabrice le 05-04-2018, 12:08

- Office 365: Menu d’administration non visible dans une page SharePoint par Blog Technique de Romelard Fabrice le 05-04-2018, 11:50

- Office 365: Comment avoir un minimum de statistiques d’usage de votre site SharePoint Online par Blog Technique de Romelard Fabrice le 05-04-2018, 11:41

- Office 365: Reconfigure la gestion des demande d’accès dans SharePoint par Blog Technique de Romelard Fabrice le 05-04-2018, 10:41