David Catuhe
Le pourquoi du comment des Dependency Properties
Visite guide de la technologie des Dependency Properties introduite par WPF
Par David Catuhe publié le 27/08/2007 à 01:00, lu 8294 fois, 4 pages
 3 | Attached Properties
Une attached property est une dependency property qui peut être attachée à postériori à un objet.

Ces dernières permettent notamment à des containers (Grid, Canvas, ...) de trouver des propriétés importantes pour leur rendu sur les contrôles qu'ils contiennent.

Prenons par exemple une grille avec 2 lignes :

<Grid>

    <Grid.RowDefinitions>

        <RowDefinition></RowDefinition>

        <RowDefinition></RowDefinition>

    </Grid.RowDefinitions>

</Grid>

Si nous souhaitons positionner un bouton dans la ligne 2, il faut que ce bouton puisse l'indiquer à la grille. Or, de base, un bouton n'a pas ce genre de propriétés (et heureusement, sinon il faudrait fournir des contrôles extrêmement complexe avec toutes les propriétés de tous les containers possibles).

C'est donc ici qu'interviennent les propriétés attachées. En effet, le bouton va s'attacher une valeur pour une propriété connue et hébergée par la grille pour que cette dernière puisse construire correctement son layout :

<Grid>

    <Grid.RowDefinitions>

        <RowDefinition></RowDefinition>

        <RowDefinition></RowDefinition>

    </Grid.RowDefinitions>

    <Button Grid.Row="1">

    </Button>

</Grid>

En C# le résultat équivalent se ferait aussi simplement :

bouton.SetValue(Grid.RowProperty, 1);

On voit bien ici que le bouton se comporte comme si il avait une dependency property RowProperty.

Il est aussi intéressant de voir que ces propriétés se comportent comme des dependency properties directes, à savoir qu'elles vont aussi fournir les services d'héritage de valeurs.

En reprenant notre exemple avec la taille des fontes :

<Window x:Class="WindowsApplication1.Window1"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    Title="WindowsApplication1" Height="300" Width="300"

    >

    <Grid TextElement.FontSize="20">

        <Button Width="100" Height="100" VerticalAlignment="Center" HorizontalAlignment="Center">

            Hello

        </Button>

    </Grid>

</Window>

Via une propriété attachée, c'est cette fois la grille qui définit la taille des fontes malgré le fait qu'elle ne porte pas de propriétés pour cela. Et pourtant cela fonctionne et le texte du bouton reçoit bien la bonne valeur.

Les propriétés attachées peuvent être issues de n'importe quelle dependency property mais si l'on sait que la propriété que l'on crée va être ultérieurement attachée, il vaut mieux pour des raisons d'optimisations la déclarer ainsi :

class MonControle : Control

{

    public static readonly DependencyProperty ValeurProperty;

 

    static MonControle()

    {

        ValeurProperty = DependencyProperty.RegisterAttached("Valeur", typeof(float), typeof(MonControle));

    }

}

 
» Démarrer une discussion
 
Discussion démarée par Loic Berthollet le 02/03/2008 à 11:37, 2 commentaire(s).