none
Binding sur GridView.ItemsSource, pourquoi ça marche ? RRS feed

  • Question

  • Bonjour,

    J'ai un petit exemple de binding d'une liste dans un GridView.

    Je voudrai savoir pourquoi le binding des items fonctionne ?

    En particulier le <Button Content="{Binding}" > 

    Pourquoi le binding du "Button" correspond à chaque éléments et pas à la liste List<char> ?

    Quel est le mécanisme qui fait que je retrouve mes 4 caractères à l'affichage.

    Voici mon code, c'est plutôt simple.

    En premier lieu j'ai mes données dans une liste de caractères

    namespace caractere.Model
    {
        class Donnees
        {
            private List<char> lstSymbol = null;
    
            public List<char> LstSymbol
            {
                get
                {
                    if (lstSymbol == null)
                    {
                        lstSymbol = new List<char>();
                        lstSymbol.Add('A');
                        lstSymbol.Add('B');
                        lstSymbol.Add('C');
                        lstSymbol.Add('D');
                    }
                    return lstSymbol;
                }
            }
        }
    }

    Puis le XAML avec le binding de la liste.

    <Page
        x:Class="caractere.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:caractere"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        xmlns:model="using:caractere.Model">    
        <Page.Resources>
            <model:Donnees x:Key="JeuDeDonnees"></model:Donnees>
        </Page.Resources>    
        <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}"
              DataContext="{StaticResource JeuDeDonnees}">
            <GridView ItemsSource="{Binding LstSymbol}"
                      Margin="20">
                <GridView.ItemTemplate>
                    <DataTemplate>
                        <Button Content="{Binding}" FontFamily="Segoe UI Symbol" FontSize="40"  Width="80" Height="80"/>
                    </DataTemplate>
                </GridView.ItemTemplate>
            </GridView>
        </Grid>
    </Page>

    ce qui donne l'affichage suivant

    ABCD

    Merci.


    mercredi 24 avril 2013 20:50

Réponses

  • Bonjour,

    Lorsque vous settez une collection à une itemSource, l'itemsControl (ici la gridview) fait ceci :

    • Génére un élément visuel (un itemContainer, par exemple un GridViewItem) par élément dans votre liste de données. 
    • Dans ce container, un ContentPresenter utilise votre donnée comme DataContext/Content et c'est ici que la magie se produit !
    • Ensuite il dispose les éléments en utilisant son ItemsPanel mais ceci est une autre histoire :)

    Cordialement


    Jonathan ANTOINE - Découvrez mon livre sur MVVM: http://goo.gl/N6Tmn - http://www.jonathanantoine.com

    jeudi 25 avril 2013 08:13
    Modérateur

Toutes les réponses