Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Thomas Lebrun

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

[WPF] WPF est-elle une technologie adaptée à l’accès aux données ?

La technologie WPF est de plus en plus utilisée dans le cadre de développement d’applications Windows mais la plupart des démonstrations que l’on recontre à l’heure actuelle concerne des applications où l’on retrouve énormément d’animations, des transformations à gogo, de la 3D, etc.

A n’en point juger (et Microsoft nous l’a démontré à maintes reprises), WPF est une technologie d’affichage graphique mais on pourrait tout à fait se demander ce qu’il en est pour des applications dîtes “métier” (entendez par là des applications accédant à des données).

La puissance du moteur de binding a largement fait ses preuves et, utilisé conjointement avec les Converters (convertisseurs), il devient alors possible de lier n’importe quel type .NET à une interface graphique:

public class BooleanToVisibilityConverter : IValueConverter

{

    #region IValueConverter Members

 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)

    {

        if (System.Convert.ToBoolean(value))

        {

            return Visibility.Visible;

        }

 

        return Visibility.Hidden;

    }

 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)

    {

        return null;

    }

 

    #endregion

}

De cette façon, vous n’avez plus aucunes limites en ce qui concerne l’affichage de vos objets métier sur l’interface graphique.

De leur coté, les ValidationRules (règles de validation) vous permettront de définir et d’appliquer des règles de validation (métier) dans votre code: c’est donc grâce à ces objets que vous pourrez vous assurez que l’utilisateur a bien saisi une adresse email, que celle-ci est dans le bon format, etc.:

public class IsValidEmailValidationRule : ValidationRule

{

    #region Properties

 

    public string ErrorMessage { get; set; }

 

    #endregion

 

    #region Overrides of ValidationRule

 

    public override ValidationResult Validate(object value, CultureInfo cultureInfo)

    {

        var result = new ValidationResult(true, null);

 

        string strRegex = @"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}" +

            @"\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\" +

            @".)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$";

 

        Regex regex = new Regex(strRegex);

 

        if (!regex.Match(Convert.ToString(value)).Success)

        {

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

        }

 

        return result;

    }

 

    #endregion

}

De plus, la possibilité d’utiliser des ControlTemplate sur la propriété ErrorTemplate permet aux designers de laisser libre court à leur imagination, en ce qui concerne l’affichage des erreurs issues des violations des règles de validations:

<ControlTemplate x:Key="PasswordErrorTemplate">

    <DockPanel LastChildFill="True">

        <Grid x:Name="gridRowErrorTemplate"

              DockPanel.Dock="Right"

              Margin="5,0,0,0">

            <Ellipse Width="72" Height="72" Stretch="Fill" Fill="#FFFF0000"/>

                <Ellipse Width="60.1967" Height="48.6885" Stretch="Fill">

                    <Ellipse.Fill>

                        <LinearGradientBrush StartPoint="0.622549,1.25444" EndPoint="0.622549,-0.52071">

                            <LinearGradientBrush.GradientStops>

                                <GradientStop Color="#00FFFFFF" Offset="0"/>

                                <GradientStop Color="#FFFFFFFF" Offset="1"/>

                            </LinearGradientBrush.GradientStops>

                        </LinearGradientBrush>

                    </Ellipse.Fill>

                </Ellipse>

                <Path Width="39.9876" Height="39.9876" Stretch="Fill" Fill="#FFFFFFFF" Data="F1 M 500.623,313.566L 508.446,321.39L 496.276,333.56L 508.446,345.73L 500.623,353.554L 488.453,341.384L 476.282,353.554L 468.459,345.73L 480.629,333.56L 468.459,321.39L 476.282,313.566L 488.453,325.737L 500.623,313.566 Z "/>

 

                <Grid.LayoutTransform>

                    <ScaleTransform ScaleX="0.3"

                                    ScaleY="0.3" />

                </Grid.LayoutTransform>

        </Grid>

 

        <Border BorderBrush="Red" BorderThickness="2">

            <AdornedElementPlaceholder />

        </Border>

    </DockPanel>

</ControlTemplate>

En ce qui concerne la sélection des données, l’objet CollectionViewSource est également là pour vous simplifier la vie: les fonctionnalités de navigation, tri, regroupement et filtre étant gérées directement par cet objet, vous n’avez pas besoin de vous souciez de l’implémentation de ce genre de détails:

private void FilterCollectionViewSource(object sender, FilterEventArgs e)

{

    var user = e.Item as User;

    if (user != null)

    {

        e.Accepted = !this.disallowedName.Contains(user.AccountName);

    }

}

La technique utilisée pour trier ou filtrer ne vous convient pas ? Pas de soucis: il vous suffit de créer votre propre collection à partir de la classe CollectionView !

Toutes ces fonctionnalités sont fortes intéressantes mais ne seraient rien sans un ensemble de contrôles associés. Parmis ces contrôles, on retrouve le fameux DataGrid tant attendu à la sortie de WPF et accessible dans le Toolkit mis à disposition par Microsoft:

Autre contrôle qui offre une grande expérience utilisateur, le Ruban a longtemps été demandé par les utilisateurs suite à la mise à disposition, par Microsoft, de de la suite Office 2007:

image image

Ce contrôle, lui aussi disponible dans le Toolkit de Microsoft (mais encore en version Beta) utilise le système de commandes de WPF, qui permet de découpler la définition de l’implémentation: un point important qui se révèle une nouveauté fort appréciable et très pratique !

 

Tous ces points nous emmènent à la conclusion suivante: WPF est non seulement une technologie d’affichage d’interfaces graphiques mais possèdent également beaucoup d’atouts non négligeables qui permettent d’affirmer une chose: oui, il s’agit sans conteste d’une technologie adaptée à l’accès aux données et les améliorations/nouveautés effectuées en ce sens, au cours des mois passés (et à venir), ne font que renforcer cette idée !

 

Et vous, quelle est votre avis/opinion ?

 

A+

 

PS: Il ne s’agit là que de mon avis/point de vue qui permet de démarrer un débat sur le sujet Smile
PS2: Un bon post sur le sujet: http://blogs.msdn.com/darioa/archive/2009/01/03/key-reasons-why-use-wpf-on-a-business-application.aspx

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 6 janvier 2009 10:09 par Thomas LEBRUN
Classé sous : , ,

Commentaires

JAPF a dit :

Je suis entièrement d'accord avec toi sur ces points.

Je pense que l'adoption de WPF pour les applications LOB est difficile par car beaucoup de concepts jusque là bien établis changent.

La façon de penser n'est plus la même, la manière de gérer les équipes non plus. Il faut être prêt à apprendre à nouveau plein de choses, et ça nécessite du temps :)

# janvier 6, 2009 11:48

Alexandre Marlot a dit :

Billet très intéressant sur WPF et les applications metiers.

Olivier Dahan a publié lui aussi récemment un excellent article avec 10 bonnes raisons de choisir WPF : http://www.e-naxos.com/Blog/post/2008/12/18/10-bonnes-raisons-de-choisir-WPF-(nouvel-article-a-telecharger).aspx

# janvier 6, 2009 11:49

Jem a dit :

Je bosse principalement sur des applis de gestion en WinForms et pour le moment ca me couterait bien trop cher de passer en WPF même si l'envie y est :

* Temps d'apprentissage du WPF

* Style graphique par défaut des contrôles assez moche (en WinForms 2 et avec des libs de type Ascend on fait une appli élégante en quelque clics, le WPF a beaucoup plus de possibilités mais requiert l'achat d'un nouveau logiciel (Blend) ou bien des heures et des heures de bidouillage de la source XAML, sans compter les compétences de designer qui ne sont pas forcément présente chez un éditeur de logiciel de gestion).

* Très mauvaise gestion du Databinding via l'IDE dans VS 2008 : en Winforms tout peut se gérer via les designers, en WPF il faut aller taper directement le code de Binding dans le XAML.

Quand je vois dans l'article en lien : "The whole form only needs very few lines of business code [...]. All the data transfer and validation between the controls and the application code behind is entirely managed by XAML tags." ca me fait un peu bondir : le XAML est AUSSI DU CODE et qui possède beaucoup moins d'aide à la rédaction que les traditionnels C# et VB au sein de l'IDE.

Bref : technologie adaptée oui, mais quand on aura des outils et des contrôles au niveau de ce que propose les WinForms et à condition de trouver le temps de se former (quand on me demande de chiffrer un projet qui serait réalisé en 2 mois maxi en WinForms, je me vois mal ajouter 1 mois au planning pour se former à WPF).

# janvier 6, 2009 12:34

fredhamel a dit :

Bonjour,

Pour moi WPF est pret pour les applications métier notament pour les différents points que tu énnonces.

--&gt; En ce qui concerne le temps d'apprentissage je dirais oui il est important! Mais WPF est sortie depuis un moment déjà et Silverlight pouce tres fort. Je pense qu'il est important pour les professionnels en .NET de suivrent et de ce tenir à jour quand il faudra faire le saut ça risque d'être difficile sans avoir fait un peu de veille continue!

--&gt; Pour les outils c'est encore très légé. Le designer dans VS 2008 SP1 est presque inutilisable sinon en mode XAML. Blend Manque cruellement de fonctionalitées comme le support de TFS, le support des solutions folders etc... Il est tres lent sur les gros projets. Et structurer ses resouces est encore assez difficile.

--&gt; pour les applications métier qui doivent gérer des choses assez classiques comme des plans de comptes ou des hiérarchies le Tree view wpf a des performance déplorable quand on dépasse les quelques millier de noeuds.

Voila sinon personnellement je repartirais pas sur Windows forms, et j'aime vraiment WPF donc je dis un grand oui! comme Thomas

# janvier 6, 2009 13:45

FREMYCOMPANY a dit :

Personnelement, j'adore XAML et WPF ! ... dans la théorie.

Mais il manque quelque chose de crucial à WPF : Un Designer qui fait le travail à notre place ! Sous WinForms, il est très simple de réaliser une appli au look professionnel, un très grand nombre de composants bien pensés et bien designés sont présents dans les API des base. En WPF, on est (pour l'instant) beaucoup moins aidé quand on fait du WPF que quand on fait de WinForms, et le nombre de controle WPF est plus faible que celui des WinForms, et ils souffrent parfois encore de quelques défauts.

Par ailleurs, là où tous les contrôles WinForms se contentaient de types de base, les controles WPF acceptent de grandes variétés de types, mais cela limite aussi l'intellisense (exemple: Button.Text:String de WinForms, Button.Content:Object de WPF) et oblige à des tests et du casting. On se retrouve avec le même problème que dans le HTML, sans que le 'DOM' de WPF soit aussi performant (mais cela va venir, on en est qu'à la version 1.0 de WPF, les prochaines versions de WPF apporteront sans doute des mises-à-jour de ce côté-là)

Sans quoi je trouve que WPF est très certainement une solution d'avenir,

Fremy

# janvier 6, 2009 16:10

jcq a dit :

Sur papier le WPF est vraiment génial, mais à l'utilisation c'est d'un compliqué !! pourquoi les propriétés standardisés depuis des années sont différentes des winform ? Pourquoi utiliszer le WPF signifie réapprendre pratiquement complétement une méthode de programmation...

Je trouve le WPF très compliqué, on a 1 tonne de nouveau type, objet, etc... Il y a quelques années programmer était plus simple.

# janvier 7, 2009 10:44

Thomas LEBRUN a dit :

&gt;&gt; Je trouve le WPF très compliqué, on a 1 tonne de nouveau type, objet, etc... Il y a quelques années programmer était plus simple.

Le même problème à eu lieu lors du passage à .NET et au final, .NET s'en sort plutôt bien.

Certes, il y a des choses à savoir mais en cherchant un peu, on trouve rapidement. Donc, dire que c'est très compliqué.....

# janvier 7, 2009 10:51

Jem a dit :

C'est justement dommage de devoir repartir sur une technologie très immature au moment ou la plateforme WinForms atteint une réelle maturité au niveau des outils et des libs.

Est-ce que vous vous souvenez de l'horreur des premiers projets .NET en 2001/2002 ? Les bugs dans les Dataset et les Datagrid, la très mauvaise gestion des bases Access, les DataAdapters inutilisables, les Toolbars moches... ?

Et bien c'est reparti pour un tour...

# janvier 7, 2009 11:43

Thomas LEBRUN a dit :

Sauf que cette fois-ci, Microsoft a su tirer des leçons de ses erreurs (enfin, on l'espère :)

Vous dîtes que la techno est très immature ? Personnellement, je vous dirais que ce sont les outils associés qui ne sont pas au point (VS 2008 par ex): la techno en elle-même n'a pas tant de défaut que cela.

# janvier 7, 2009 11:49

FREMYCOMPANY a dit :

Je te suis sur ce point : La techno est (presque) mature, mais pas l'IDE.

Même si je regrette que le texte d'un controle, on l'obtienne parfois avec Text et parfois avec Content. Dans le cas des composants avec Content, il devrait y avoir une propriété Text qui retournerait Content s'il s'agit d'une chaine de caractère et "" sinon. Cela éviterait pas mal de castings aux développeurs.

Aussi, l'intellisense est devenu très moyen sous VB+WPF à cause du nombre énorme de champs 'static read-only' qu'on reçoit pour les instances et qui ne nous servent à rien mais prennent plein de place. Sur ce coup-là, l'équipe VB devrait améliorer l'intellisense pour qu'il ne propose pas ces trucs au début, et qu'ils ne les nombres que dans la catégorie 'Toutes' (et pas 'Communes').

# janvier 7, 2009 12:52

pcabanel a dit :

J’utilise WPF dans mon activité professionnelle pour réaliser des applications gestion. Certes le passage à WPF est un effort mais le gain en termes d’architecture au final est considérable.

Le  point qui me semble le plus important c’est la séparation nette entre le code UI et le code métier. Pour un éditeur de logiciel qui doit maintenir ses produits sur plusieurs années c’est essentiel de pouvoir faire évoluer ses applications sans avoir à tout casser.

D’autant que cela permet une nouvelle organisation dans le travail, avec des dev sur la partie métier et d’autres sur le xaml.

Autre point non négligeable, c’est que le code développé avec WPF est facilement adaptable pour Silverlight.

En ce qui concerne WinForms c’est très bien, mais trop limité. La personnalisation des contrôles c’est des heures et des jours de travail. Avec WPF, la plus part du temps, il suffit de jouer avec les styles et les templates pour atteindre son objectif.

Seul point négatif, WPF en termes de design est moins structurant que WinForms, trop de possibilités conduisent à voir et à revoir l’interface. Au bout du compte il faut plus de temps pour développer. Par contre le résultat c’est que du bonheur ;)

Pascal.

# janvier 7, 2009 22:27
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- [Refactoring] ReSharper pour Visual Studio 2010 (Preview) par Thomas Jaskula le il y a 7 heures et 24 minutes

- [Refactoring] Analyser vos exceptions avec ReSharper Exceptional par Thomas Jaskula le il y a 8 heures et 38 minutes

- SharePoint 2007 : patterns & practices SharePoint Guidance par Philippe Sentenac [MVP SharePoint] le il y a 22 heures et 17 minutes

- [Visual Studio 2010] Les tests cases c’est bien, mais je vais devoir tout réécrire ? par Etienne Margraff le il y a 23 heures et 14 minutes

- MVP[Gribouillon].AddYear par The Grib's Lair [Sébastien PICAMELOT - MVP SharePoint] le il y a 23 heures et 29 minutes

- Clinique INSIA - Projet de fin d’Etudes (Silverlight 3 MVVM et OutOfBrowser, WCF, TFS) - Part 1 par David REI le 07-02-2009, 23:38

- C’est la crise ? Bah pourquoi cramer du budget pub alors ? par Nix's Blog le 07-02-2009, 15:31

- Soyons MVP ! par TheSaib .NET blog le 07-02-2009, 12:15

- SharePoint : Gestion des Erreurs 6398, 7076 et 6482 par Blog Technique de Romelard Fabrice le 07-02-2009, 11:53

- EF avec WPF par Matthieu MEZIL le 07-02-2009, 10:18