Accueil > WPF > [WPF] : First step into binding

[WPF] : First step into binding

Le binding est une notion qui existait déjà en WinForm mais était relativement limité. En WPF il en est tout autrement : nous disposons d’un outil extrêmement puissant… à condition de savoir l’utiliser mais aussi de savoir ce qu’il permet !

Si je devais résumer ce qu’est le DataBinding en quelque mots voici comment je le définirais : le DataBinding de WPF fournit un moyen simple et efficace d’interagir avec les données. c’est un terme anglais désignant l’action de lier des éléments entre eux. Les éléments peuvent être attachés à des données diverses et variées telles que du XML, la CLR mais aussi des autres éléments…

Au travers de ce post nous allons voir tout ce que nous propose le Binding de WPF.

Path

Définit concrètement dans quelle propriété on souhaite récupérer la valeur.


<TextBlock Text="{Binding Path=NomDeLaPropriete}"/>

Ainsi dans ce cas vous vous récupérez la valeurs de NomDeLaPropriete pour l’appliquer en tant que texte du contrôle TextBlock.

ElementName

Permet de définir que la source de données sur laquelle on souhaite effectuer le binding. Ici par exemple nous écoutons la valeur saisie dans la textbox via la propriété Text de la TextBox que l’on affecte à la propriété Text du TextBlock :


<StackPanel>
<TextBlock Text="{Binding Path=Text, ElementName=LaTextBox}"/>
<TextBox x:Name="LaTextBox"/>
</StackPanel>

Converter

Permet de définir un convertisseur de données à appliquer sur la donnée initiale pour effectuer une transformation et appliquer cette valeur et non pas celle initiale.

Vous devez déclarer une classe héritant de IValueConverter et redéfinir Convert et ConvertBack


public class VotreConverter : IValueConverter

{

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

{

*/convertissez ici votre valeur initiale (ex un booléen que vous
 devriez convertir en texte du genre si true
 alors “Masculin”, si false ”Féminin”)  donnerait :*/

if(value is bool)

{

if((bool)value)

return “Masculin”;

else

return “Féminin”;

}

return “Valeur inconnue”;

}

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

{

/*ici si vous le pouvez reconvertissez votre valeur
convertie en valeur initiale, sinon lancer une exception par exemple.*/

}

}

FallbackValue

Définit une valeur à utiliser dans le cas où le binding ne peut renvoyer une valeur, ainsi par exemple si le binding ne trouve pas la propriétée « NomDeLaPropriete » alors il appliquera la valeur « valeur_par_defaut_ici» au texte du TextBlock.


<TextBlock Text="{Binding Path=NomDeLaPropriete,
			  FallbackValue='valeur_par_defaut_ici'}" />

Mode

Définit la direction du binding. En WPF vous avez la possibilité d’affiner le comportement du binding en lui définissant un mode. Toutes les propriétés des éléments du framework n’ont pas forcement le même type de binding et donc il est conseillé de vérifier le sens par défaut des propriétés des éléments.

Default

Utilise le sens de binding par défaut de la propriété.

OneWay

De la source vers la destination, si la source change : la destination aussi !

Source >> Destination

OneWayToSource

N’est autre que l’inverse de OneWay, cette fois ci c’est la destination qui affecte la valeur à la source.

Destination >> Source

OneTime

Le binding de la source vers la destination s’effectue une seul fois puis, si la source change la valeur n’est pas appliquée à la destination. On utilise OneTime généralement quand vos objets sont uniquement en mode visualisation et afin d’améliorer les performances du fait que le binding n’écoute pas inutilement la source de données.

Source > 1 fois > Destination

TwoWay

Les changement de la source sont effectués sur la destination et vice et versa, si la destination change la valeur, la source est également modifiée !!

Source >><< Destination

RelativeSource

Utilisé pour définir une source de données en spécifiant un élément qui est positionné relativement par rapport à l’élément courant qui souhaite faire le binding.

Le propriétée RelativeSource du binding est utilisé pour binder une donnée provenant d’un élément par sa relation avec l’élément source du déclanchement du binding.

Il existe plusieurs façons d’utiliser cette propriété donc les plus communes sont las suivantes :

* Quand l’élément source est égal à la cible (utile pour se binder sois même) et éviter d’avoir à donner un nom à l’élément et utiliser ElementName :


<CheckBox Content="{Binding Path=IsChecked,
			    RelativeSource={RelativeSource Self}}" />

* Quand l’élément source est égal au Template utilisé pour l’élément. Utilisé fréquemment lors dans les styles :


{Binding Path=Proprietee,
	 RelativeSource={RelativeSource TemplatedParent}}

* Quand la l’élément source est égal au plus proche des parents d’un type donné (ici renvoie Grille1)


<Grid x:Name="Grille1">
<StackPanel>
<TextBlock Text="{Binding Path=Name,
        RelativeSource={RelativeSource Mode=FindAncestor,
                                       AncestorType={x:Type Grid}}}" />
</StackPanel>
</Grid>

* Quand vous souhaitez le nième parent d’un type donné ex le deuxième parent du type Grid (ayant le nom Grille1 et non Grille2 comme dans l’exemple précédent)


<Grid x:Name="Grille1">
<Grid x:Name="Grille2">
<StackPanel>
<TextBlock Text="{Binding Path=Name,
			  RelativeSource={RelativeSource Mode=FindAncestor,
					  AncestorType={x:Type Grid},
					  AncestorLevel=2}}" />
</StackPanel>
</Grid>
</Grid>

Source

Utilisé quand ou veut utiliser un objet source à utiliser pour effectuer le binding (et non pas un élément)

StringFormat

Nouveauté apportée dans le .Net 3.5 SP1 qui nous permet de formater la donnée bindée. Avant le SP1 il fallait créer son propre Converter se chargeant d’effectuer un String.Format…


<CheckBox Content="{Binding Path=IsChecked,
			    RelativeSource={RelativeSource Self},
			    StringFormat='La valeur de IsChecked est : {0} !'}" />

Ainsi dans le texte de la CheckBox on verra apparaitre la phrase : “La valeur de IsChecked est : True !!!” ou False suivant la valeur de IsChecked.

Si l’on souhaite utiliser plusieurs valeurs dans le StringFormat il faudra utiliser un MultiBinding comme ici par exemple ou l’on souhaite faire une phrase avec la valeur saisie dans deux textbox :


<StackPanel>
   <TextBlock>
      <TextBlock.Text>
         <MultiBinding StringFormat="Textbox1 : ({0}), Textbox2 : ({1})">
            <Binding ElementName="LaTextBox1"
                     Path="Text" />
            <Binding ElementName="LaTextBox2"
                     Path="Text" />
            </MultiBinding>
       </TextBlock.Text>
   </TextBlock>
   <TextBox x:Name="LaTextBox1" />
   <TextBox x:Name="LaTextBox2" />
</StackPanel>

UpdateSourceTrigger

Définit les evénements sur lequels le binding va s’effectuer. Généralement le binding TwoWay et OneWayToSource propagent les nouvelles valeurs à chaque fois que la propriété sur laquelle le binding est appliqué sur la propriété cible. Toutefois dans certains cas (performances, annulations, actions, etc.) nous avons besoin de déterminer la façon dont va s’appliquer le binding…

Prenons l’exemple d’une TextBox dont voici le XAML de base


<TextBox Text="{Binding Path=NomDeLaPropriete,
			Mode=TwoWay}"/>

Mode=TwoWay n’est pas obligatoire car il s’agit du mode par défaut de la Dependency Property TextProperty de la TextBox.

LostFocus


<TextBox Text="{Binding Path=NomDeLaPropriete,
			Mode=TwoWay,
			UpdateSourceTrigger=LostFocus}"/>

Dans ce cas la valeur entrée dans la TextBox sera propagée dans la propriétée NomDeLaPropriete une fois que la TextBox perd le focus et uniquement dans ce cas !

PropertyChanged


<TextBox Text="{Binding Path=NomDeLaPropriete,
			Mode=TwoWay,
			UpdateSourceTrigger=PropertyChanged}"/>

Dans ce cas la valeur entrée dans la TextBox sera propagée dans la propriété NomDeLaPropriete à chaque fois que vous tapez un caractère dans la TextBox ! Attention donc si vous devez faire des traitements long à chaque fois que la valeur change…

Explicit


<TextBox x:Name="LaTextBox"
	 Text="{Binding Path=NomDeLaPropriete,
			Mode=TwoWay,
			UpdateSourceTrigger=Explicit}"/>

Dans ce cas la valeur entrée dans la TextBox sera propagée dans la propriété NomDeLaPropriete quand le développeur le souhaitera ! Pour cela vous devez utiliser la syntaxe suivante :


BindingExpression binding = null;
binding = LaTextBox.GetBindingExpression(TextBox.TextProperty);
binding.UpdateSource();

Et là la valeur que l’utilisateur aura saisi dans la textbox sera propagée dans la propriété NomDeLaPropriete.

ValidationRules

Définit une collection de règles de validation appliquées sur la valeur du binding. Nous en reparlerons dans un autre article.

IsAsync

Cette propriétée est interessante dans le cas de propriétées qui sont couteuse en temps

Il faut utiliser cette propriété lorsque la propriétée source du binding prend un peu de temps. L’exemple le plus commun est une propriété image avec un “accesseur get” qui télécharge une image depuis le web… Mettre IsAsync=True empèche que la fenêtre soit bloquée pendant que le téléchargement s’effectue en réalisant cette tâche de façon asynchrone.


<Image Source="{Binding Path=ProprieteeImageLente,
			IsAsync=True" />

Publicités
Catégories :WPF
  1. SG
    25 avril 2012 à 10 h 12

    « dictionnaire très complet et précis …

    Une suggestion : il faudrait des exemples complets pour mieux assimiler.

  1. No trackbacks yet.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion /  Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion /  Changer )

w

Connexion à %s

%d blogueurs aiment cette page :