[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:
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 
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 :