IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

Binder dans un template sur l'index d'un item d'une liste


Sujet :

Windows Presentation Foundation

  1. #1
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut Binder dans un template sur l'index d'un item d'une liste
    Bonjour,

    Dans un datatemplate relatif aux items d'un control prenant en source une collection, comment binder sur l'index de l'item ?


    Par exemple

    je souhaiterai afficher dans une liste

    0 toto
    1 titi
    2 tutu

    et si je supprime titi de ma liste, ca doit m'afficher

    0 toto
    1 tutu


    D'avance merci,

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    En principe tu n'as pas accès directement à l'index, mais il y a une astuce qui permet de le faire, en détournant la propriété attachée AlternationIndex de son usage normal :

    - dans le ItemsControl, tu mets la propriété attachée AlternationCount à une très grande valeur (par exemple Int32.MaxValue)
    - dans le template, tu bindes sur le AlternationIndex de l'élément

    Code XAML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <ListView ItemsSource="{Binding Items}" AlternationCount="{x:Static sys:Int32.MaxValue}">
     
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Index" DisplayMemberBinding="{Binding (ItemsControl.AlternationIndex), RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}}}" />
                <GridViewColumn Header="Text" DisplayMemberBinding="{Binding Text}" />
            </GridView>
        </ListView.View>
     
    </ListView>

    Le principe est que la propriété AlternationIndex est égale à l'index de l'élément modulo AlternationCount. Donc si la valeur de AlternationCount est assez grande pour que l'index ne l'atteigne jamais, AlternationIndex est toujours égal à l'index

    L'inconvénient, c'est qu'avec ça tu ne peux plus utiliser AlternationCount pour son usage normal (à savoir faire des styles qui alternent d'un item à l'autre)

    Une autre possibilité, un peu plus compliquée, est d'utiliser un convertisseur qui utilise la méthode ItemContainerGenerator.IndexFromContainer

  3. #3
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut
    Merci pour la réponse tomlev !

    Pour l'instant ça ne marche pas, ça affiche zero tout le temps.

    Mon contrôle est un ItemsControl pure.

    du coup je n'ai pas mis ListViewItem mais ContentControl, ne sachant pas de quel type sont les items des ItemsControl.

  4. #4
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut
    bonjour,

    Bon j'ai galéré, je n'ai pas trop compris ce que j'ai fait, je me suis inspiré de ce post : http://www.developpez.net/forums/d10...ition-binding/

    mais... ça marche

    Voici le code.

    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    <TextBlock="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ContentPresenter}}, Path=(ItemsControl.AlternationIndex)}" />

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Bah c'est à peu près pareil, sauf qu'effectivement avec un ItemsControl le conteneur n'est pas un ListViewItem mais un ContentPresenter...

    Au passage ça m'a rappelé de qui je tenais cette idée

  6. #6
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut
    Oui oui, c'est bien de ton code dont je suis parti, ça m'a donné les mots clefs à taper sous google pour trouver la petite modif à ton code qu'il fallait faire pour que ça marche dans mon cas.

    Merci Thomas.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Binder dans un template sur l'index de colone
    Par obarator dans le forum Windows Presentation Foundation
    Réponses: 0
    Dernier message: 26/02/2014, 09h47
  2. Réponses: 8
    Dernier message: 06/07/2008, 12h44
  3. Trier (Sort) sur un attribut d'un attribut d'une liste
    Par Gaaaga dans le forum ActionScript 3
    Réponses: 2
    Dernier message: 06/05/2008, 11h29
  4. [Infobulle]sur les item d'une liste déroulante
    Par mamiberkof dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 24/05/2007, 12h31
  5. Se positionner sur un item d'une liste déroulante
    Par pyxosledisciple dans le forum IHM
    Réponses: 1
    Dernier message: 08/02/2006, 21h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo