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 :

Position dans un binding


Sujet :

Windows Presentation Foundation

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    849
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 849
    Par défaut Position dans un binding
    Je débute complétement sur WPF, je viens plus du monde asp.net

    Je fais un Binding sur une ListBox. Dans cette listBox, J'ai mon controle utilisateur que j'ai créer.

    Mon controle est donc afficher plusieurs fois. J'aurais besoin d'afficher le numéro de sa position d'affichage.

    Le binding
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     <ListBox ItemsSource="{Binding Path=PlayersList}">
                <ListBox.ItemTemplate>                
                    <DataTemplate>
                        <StackPanel>
                            <local:ucPlayerRegisterView Content="{Binding Path=Name}" />                      
                        </StackPanel>                    
                    </DataTemplate>               
                </ListBox.ItemTemplate>
            </ListBox>

    Le controle
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <UserControl x:Class="BuzzerGame.View.Control.ucPlayerRegisterView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
        <StackPanel Orientation="Horizontal">
            <Label>Player [Position]</Label>
            <TextBox VerticalAlignment="Bottom" Width="200" Text="{Binding Path=Name}"/>
        </StackPanel>
     
    </UserControl>

    Je bind mon control avec une objet de type Player mais il n'a pas de propriété Position

    Comment faire ?

    Merci beaucoup pour votre aide

  2. #2
    Membre émérite Avatar de jmix90
    Homme Profil pro
    Consultant .Net
    Inscrit en
    Juillet 2007
    Messages
    576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2007
    Messages : 576
    Par défaut
    Hello,

    Une méthode que j'utilise car c'est rapide c'est :
    1. Tu met la propriété AlternationCount de l'itemcontrol à Int32.MaxValue (la valeur réelle que je ne connais pas par coeur :-) )
    2. Dans chaque item tu peux utiliser un binding sur ItemsControl.AlternationIndex pour avoir l'index (cf exemple ci-dessous)


    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     <StackPanel Orientation="Horizontal">
          <TextBlock Text="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=(ItemsControl.AlternationIndex),StringFormat=Position \{0\}}" />
     
            <TextBox VerticalAlignment="Bottom" Width="200" Text="{Binding Path=Name}"/>
        </StackPanel>

    Bon courage,

  3. #3
    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 : 44
    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
    Par défaut
    Citation Envoyé par jmix90 Voir le message
    Une méthode que j'utilise car c'est rapide c'est :
    1. Tu met la propriété AlternationCount de l'itemcontrol à Int32.MaxValue (la valeur réelle que je ne connais pas par coeur :-) )
    2. Dans chaque item tu peux utiliser un binding sur ItemsControl.AlternationIndex pour avoir l'index (cf exemple ci-dessous)
    Bien vu
    J'allais proposer une solution un peu plus violente à base de converter et ItemContainerGenerator, mais la tienne est beaucoup plus simple

  4. #4
    Membre émérite Avatar de jmix90
    Homme Profil pro
    Consultant .Net
    Inscrit en
    Juillet 2007
    Messages
    576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2007
    Messages : 576
    Par défaut
    Merci

  5. #5
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Bien vu
    J'allais proposer une solution un peu plus violente à base de converter et ItemContainerGenerator, mais la tienne est beaucoup plus simple
    +1! Je ne connaissais pas AlternationIndex , mais ça va rentrer dans mon arsenal, merci!

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    849
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 849
    Par défaut
    Je suis en 3.5
    Et j'ai cette erreur:

    Mode must be specified for RelativeSource
    Je cherche sur google, mais je n'arrive pas.

  7. #7
    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 : 44
    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
    Par défaut
    Citation Envoyé par Oberown Voir le message
    Je suis en 3.5
    Et j'ai cette erreur:

    Mode must be specified for RelativeSource

    Je cherche sur google, mais je n'arrive pas.
    Fais voir le code exact que tu as utilisé
    Tu as vraiment une erreur de compil, ou c'est juste le designer XAML qui indique une erreur ?

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    849
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 849
    Par défaut
    C'est une erreure de compil

    Code Xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <UserControl x:Class="BuzzerGame.View.Control.ucPlayerRegisterView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
        <StackPanel Orientation="Horizontal">
            <Label>Player</Label>
            <TextBlock Text="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=(ItemsControl.AlternationIndex),StringFormat=Position \{0\}}" />
            <TextBox VerticalAlignment="Bottom" Width="200" Text="{Binding Path=Name}"/>
        </StackPanel>
     
    </UserControl>

  9. #9
    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 : 44
    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
    Par défaut
    Citation Envoyé par Oberown Voir le message
    C'est une erreure de compil
    Bizarre... si je copie ce code dans Kaxaml, j'ai pas d'erreur (mais le binding marche pas)

    Normalement TemplatedParent c'est quand tu es dans un template. Essaie avec Self à la place de TemplatedParent, ça a l'air de fonctionner

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    849
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 849
    Par défaut
    Self non plus ne marche pas

  11. #11
    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 : 44
    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
    Par défaut
    grr... essaie ça alors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}, Path=(ItemsControl.AlternationIndex),StringFormat=Position \{0\}}" />
    Si tu as toujours l'erreur "Mode must be specified for RelativeSource", essaie de recompiler entièrement (Rebuild solution). Tu devrais pas avoir cette erreur puisque le mode est bien spécifié, mais des fois ça déconne un peu...

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    849
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 849
    Par défaut
    En effet en faisant en clean, je n'ai pas de probleme. Ca compile mais je n'ai pas d'affichage de la position. Ai-je bien mis AlternationCount ?

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     <ItemsControl ItemsSource="{Binding Path=PlayersList}" AlternationCount="500">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <local:ucPlayerRegisterView />
                        </StackPanel>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>

    Le user control a part
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <UserControl x:Class="BuzzerGame.View.Control.ucPlayerRegisterView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
        <StackPanel Orientation="Horizontal">
            <Label>Player</Label>
            <TextBlock Text="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=(ItemsControl.AlternationIndex),StringFormat=Position \{0\}}" />
            <TextBox VerticalAlignment="Bottom" Width="200" Text="{Binding Path=Name}"/>
        </StackPanel>
     
    </UserControl>

  13. #13
    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 : 44
    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
    Par défaut
    Essaie avec le Mode=FindAncestor comme dans mon post précédent. J'ai l'impression que comme tu es dans un UserControl, TemplatedParent fait référence au UserControl et non au ListBoxItem.

    Petite remarque en passant : dans ton DataTemplate, le StackPanel ne sert à rien vu qu'il ne contient qu'un élément. Tu peux mettre directement le ucPlayerRegisterView

  14. #14
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    849
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 849
    Par défaut
    J'ai mis ça, et toujours pas d'affichage:

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <UserControl x:Class="BuzzerGame.View.Control.ucPlayerRegisterView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
        <StackPanel Orientation="Horizontal">
            <Label>Player</Label>
            <TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}, Path=(ItemsControl.AlternationIndex),StringFormat=Position \{0\}}" />
            <TextBox VerticalAlignment="Bottom" Width="200" Text="{Binding Path=Name}"/>
        </StackPanel>
     
    </UserControl>

  15. #15
    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 : 44
    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
    Par défaut
    Est-ce qu'il y a des erreurs de binding ? regarde dans la fenêtre Output (Sortie) de Visual Studio

  16. #16
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    849
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 849
    Par défaut
    En effet j'ai:

    System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.ListBoxItem', AncestorLevel='1''. BindingExpression:Path=(0); DataItem=null; target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')
    J'ai remplacé mon ancestor Type: ListBoxItem par ItemsControl.

    Mais j'ai position 0 qui s'affiche pour tous.

    Petite question. Si mon controle n'est plus dans ItemsControl mais dans un listBox ca ne marchera plus ?

  17. #17
    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 : 44
    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
    Par défaut
    Ah ok je vois

    Dans le premier code que tu as posté c'était une ListBox, donc le conteneur de chaque item était un ListBoxItem. Mais maintenant c'est un ItemsControl, donc pas de ListBoxItem... Il n'y a pas de conteneur spécifique pour les items de ItemsControl, ils sont juste placés dans un ContentPresenter. Donc si tu mets ContentPresenter comme AncestorType, ça devrait le faire

  18. #18
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    849
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 849
    Par défaut
    Pas d'erreur, mais j'ai position 0 qui s'affiche sur chaque ligne

    Mon code pour éviter les confusions:

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <UserControl x:Class="BuzzerGame.View.Screen.PlayersCreateView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:BuzzerGame.View.Control">
        <StackPanel Orientation="Vertical">
     
            <ItemsControl ItemsSource="{Binding Path=PlayersList}" AlternationCount="500">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                            <local:ucPlayerRegisterView />
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
     
            <Button Command="{Binding SaveCommand}"><Label>Valider</Label></Button>
        </StackPanel>
    </UserControl>

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <UserControl x:Class="BuzzerGame.View.Control.ucPlayerRegisterView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
        <StackPanel Orientation="Horizontal">
            <Label>Player</Label>
     
            <TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ContentPresenter}}, Path=(ItemsControl.AlternationIndex),StringFormat=Position \{0\}}" />
            <TextBox VerticalAlignment="Bottom" Width="200" Text="{Binding Path=Name}"/>
        </StackPanel>
     
    </UserControl>

  19. #19
    Membre émérite Avatar de jmix90
    Homme Profil pro
    Consultant .Net
    Inscrit en
    Juillet 2007
    Messages
    576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2007
    Messages : 576
    Par défaut
    Hello,

    Mon avis est que comme tu es dans un UserControl, tu as deux ContentPresenter et il faut que tu retrouves le bon (celui de l'item presenter). Utilises donc ce code :

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

  20. #20
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    849
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 849
    Par défaut
    C'est presque bon.

    Mais j'ai mon numéro de position qui commence à 0. Et je souhaiterais que ça soit à 1.

    Et petite question bonus, si mon controle est mis ailleurs il risque d'avoir des problèmes ?

    Merci de votre aide

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Position dans une query
    Par valoji dans le forum Bases de données
    Réponses: 5
    Dernier message: 06/01/2006, 10h49
  2. Position dans liste
    Par Pascal28 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 04/01/2006, 18h41
  3. Réponses: 5
    Dernier message: 20/02/2005, 01h14
  4. [Win32] Position dans un fichier
    Par vecchio dans le forum Windows
    Réponses: 7
    Dernier message: 22/03/2004, 16h47
  5. [VB6] Sauvegarder la position dans un Recordset
    Par inotna2099 dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 29/04/2003, 17h35

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