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 :

XML: Bind vers une liste d'attributs


Sujet :

Windows Presentation Foundation

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 158
    Points : 41
    Points
    41
    Par défaut XML: Bind vers une liste d'attributs
    Bonjour,

    J'ai un fichier XML structuré de cette façon:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <Base>
        <System>
            <Gear>Name1</Gear>
            <Kind name="att1"/>
            <Kind name="att2"/>
            <Kind name="att3"/>
        </System>
    </Base>
    Je sais que si je veux lire <Gear> je devrai faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <TextBox Text="{Binding XPath=Gear}"/>
    Mais si je veux lire l'ensemble des valeurs reprises sous <Kind>, comment dois-je procéder svp?

    Merci beaucoup!!

  2. #2
    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 : 49
    Localisation : Belgique

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

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 570
    Points
    3 570
    Par défaut
    Tu dois utiliser [@name]. Il y a un exemple ici http://msdn.microsoft.com/en-us/libr...ing.xpath.aspx

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 158
    Points : 41
    Points
    41
    Par défaut
    Merci pour ta réponse!
    Mon code est articulé comme cela:
    Pour la partie VB:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Class MainWindow
        Dim data As XmlDataProvider = New XmlDataProvider()
        Private Sub MainWindow_Initialized(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Initialized
            data.Source = New Uri(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\mGalaxy\Systems.xml")
            data.XPath = "Emulators/System"
            Grid1.DataContext = data
        End Sub
    End Class
    Pour la partie XAML:
    Code : 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
    18
    19
    20
    21
    <Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication1"         
        Title="MainWindow" Height="372" Width="525" Background="#FF4E4E64">
        <Grid Name="Grid1">
            <Grid.Resources>
                <DataTemplate x:Key="SystemTemplate">
                    <Label Content="{Binding XPath=Name}"/>
                </DataTemplate>
                <local:XPathToFullPath x:Key="XPathToFullPath"/>
            </Grid.Resources>
            <TextBox Text="{Binding XPath=AppPath, UpdateSourceTrigger=PropertyChanged}" Height="23" HorizontalAlignment="Left" Margin="197,180,0,0" Name="TextBox1" VerticalAlignment="Top" Width="220" />
            <TextBox Margin="197,283,113,0">
            <TextBox.Text>
                <Binding Source="data" XPath="*[@topplayed='name']"/>
                </TextBox.Text>
            </TextBox>
        </Grid>
    </Window>
    Mon fichier XML étant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <Emulators>
    	<System>
    		<Name>Name1</Name>
    		<Icon>Icon1.png</Icon>
    		<topplayed name="name1"/>
    		<topplayed name="name2"/>
    		<topplayed name="name3"/>
    		<Active>True</Active>
    	</System>
    </Emulators>
    Qu'est ce qui cloche dans ma partie XAML (en gras)..car cela ne semble pas fonctionner!

    Merci!!

  4. #4
    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 : 49
    Localisation : Belgique

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

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 570
    Points
    3 570
    Par défaut
    Oups...au temps pour moi...il ne faut pas les []

    Tu peux exposer ton xml avec un XmlDocument au lieu d'un XmlDataProvider :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public XmlDocument xml { get; set; }

    Et dans ton XAML :
    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      <TextBox x:Name="TheTextBlock" DataContext="{Binding xml}"
               Text="{Binding XPath=/Emulators/System/topplayed[1]/@name}">

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 158
    Points : 41
    Points
    41
    Par défaut
    Merci pour ta réponse!!
    Est que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public XmlDocument xml { get; set; }
    est indispensable à la suite?
    Car (remis dans le contexte du code tel que cité plus haut)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <TextBox x:Name="TheTextBlock" DataContext="{Binding data}"
               Text="{Binding XPath=/Emulators/System/topplayed[1]/@name}" />
    Me donne un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.Windows.Data Error: 40 : BindingExpression path error: 'data' property not found on 'object' ''XmlElement' (HashCode=14470557)'. BindingExpression:Path=data; DataItem='XmlDataCollection' (HashCode=49255810); target element is 'TextBox' (Name='TheTextBlock'); target property is 'DataContext' (type 'Object')
    Merci!!

  6. #6
    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 : 49
    Localisation : Belgique

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

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 570
    Points
    3 570
    Par défaut
    Je pense que tu peux enlever le data. Avec {binding} c'est suffisant. Ça fonctionnera même peut-être si tu ne mets rien. Ça dépend si le datacontext du contrôle parent est déjà le XmlDocument

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 158
    Points : 41
    Points
    41
    Par défaut
    Merci pour ta réponse!
    EN effet je n'ai plus de message d'erreur..et tu as raison je peux totalement enlever le <datacontext>, et même résumer le "XPath=/Emulators/System/topplayed/@name" en "XPath=//topplayed/@name".

    Malheureusement, il n'affiche qu'un seul élément alors que je voudrais tous les attributs "topplayed" de l'élément "system" courant
    Code : 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
    18
    19
     
    <Emulators>
    	<System>
    		<Name>Name1</Name>
    		<Icon>Icon1.png</Icon>
    		<topplayed name="a1"/>
    		<topplayed name="a2"/>
    		<topplayed name="a3"/>
    		<Active>True</Active>
    	</System>
    <System>
    		<Name>Name2</Name>
    		<Icon>Icon2.png</Icon>
    		<topplayed name="b1"/>
    		<topplayed name="b2"/>
    		<topplayed name="b3"/>
    		<Active>True</Active>
    	</System>
    </Emulators>
    ...mais j'en reparle après si tu veux bien, car le plus préoccupant c'est que le texte ne se met pas à jour lorsque je change d'élément dans mon ListBox!

    Pour plus de facilité à la lecture, je te recopie tout le code (tu as déja le XML, ci-dessus)

    VB.NET
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Class MainWindow
        Dim data As XmlDataProvider = New XmlDataProvider()
        Private Sub MainWindow_Initialized(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Initialized
            data.Source = New Uri(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\mGalaxy\Systems.xml")
            data.XPath = "Emulators/System"
            Grid1.DataContext = data
        End Sub
    End Class
    XAML
    Code : 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    <Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication1"         
        Title="MainWindow" Height="350" Width="525" Background="#FF4E4E64">
        <Grid Name="Grid1">
            <Grid.Resources>
                <DataTemplate x:Key="SystemTemplate">
                    <Label Content="{Binding XPath=Name}"/>
                </DataTemplate>
                <DataTemplate x:Key="topplayedTemplate">
                    <TextBlock Text="{Binding XPath=@name}"/>
                </DataTemplate>
                <local:XPathToFullPath x:Key="XPathToFullPath"/>
            </Grid.Resources>
            <ListBox Height="244" HorizontalAlignment="Left" Margin="12,12,0,0" Name="ListBox1" VerticalAlignment="Top" Width="167"
                     ItemsSource="{Binding}"
                     ItemTemplate="{StaticResource SystemTemplate}"
                     IsSynchronizedWithCurrentItem="True"
                     Visibility="Visible" SelectionMode="Single">
             </ListBox>
            <TextBox Text="{Binding XPath=//topplayed/@name}" Width="200" Margin="197,230,106,5" />
            <ListBox ItemsSource="{Binding XPath=//topplayed}" ItemTemplate="{StaticResource topplayedTemplate}" IsSynchronizedWithCurrentItem="True" Margin="425,35,12,149" />
            </Grid>
    </Window>
    En ce qui concerne le fait que je n'ai qu'un attribut qui soit affiché, tu verras que je me suis servi de ton aide pour l'adapter à un ListBox (pour avoir TOUS les attributs affichés)...et là, par contre, tous s'affichent, mais de tous les éléments à la fois (ca donne par rapport au fichier XML: a1,a2,a3,b1,b2,b3)

    Donc, pour résumer, avec le TextBox je n'ai qu'un élément affiché et il ne se met pas à jours quand je sélectionne un autre <System>
    Et avec le ListBox, tous les attributs "topplayed" de TOUS les <System> sont affichés!

    EDIT: le fait d'enlever les 2 slash devant "topplayed" fait que maintenant le textbox et le listbox sont updatés!
    Avant/Après
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <TextBox Text="{Binding XPath=//topplayed/@name}"
    <TextBox Text="{Binding XPath=topplayed/@name}"

    Merci pour ton temps et ton aide précieuse!

  8. #8
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 442
    Points
    4 442
    Par défaut
    bonjour Jayme65...
    Pour afficher les toplayed qui sont en fait des sous-champs "differents indexes" ,comme soukigne par GuruuMeditation,tu doit modifier ton datatemplate topplayedTemplate


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     <!--les index en xml commencent à 1 au lieu de 0--> 
                <DataTemplate x:Key="topplayedTemplate">
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding XPath=./topplayed[1]/@name}"/>
                        <TextBlock Text="{Binding XPath=./topplayed[2]/@name}"/>
                        <TextBlock Text="{Binding XPath=./topplayed[3]/@name}"/>
                    </StackPanel>
                </DataTemplate>
    bon code........................

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 158
    Points : 41
    Points
    41
    Par défaut
    Mabrouki,

    Merci pour ta réponse!
    Il semblerait cependant que cela fonctionne dans la ListBox sans cet ajout dans le DataTemplate!
    Ce qui est d'ailleurs préférable, car si j'avais 200 entrées "topplayed" dans le fichier XML....!

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 158
    Points : 41
    Points
    41
    Par défaut
    Bonjour à nouveau,

    J'ai voulu modifier la structure de mon XML, le faisant passer de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <Emulators>
    	<System>
    		<Name>Name1</Name>
    		<Icon>Icon1.png</Icon>
    		<topplayed name="a1"/>
    		<topplayed name="a2"/>
    		<topplayed name="a3"/>
    		<Active>True</Active>
    	</System>
    </Emulators>
    à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <Emulators>
    	<System>
    		<Name>Name1</Name>
    		<Icon>Icon1.png</Icon>
    		<topplayed>
    			<name>a1</name>
    			<name>a1</name>
    			<name>a1</name>
    		</topplayed>
    	</System>
    </Emulators>
    pour le rendre plus lisible.

    Malheureusement (j'en suis presque honteux ) je n'arrive pas à lister tous les éléments <name> dans mon listbox!

    J'ai adapté de datatemplate de cette façon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <DataTemplate x:Key="topplayedTemplate">
      <TextBlock Text="{Binding XPath=name}"/>
    </DataTemplate>
    et le listbox de cette façon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <ListBox ItemsSource="{Binding XPath=topplayed}" ItemTemplate="{StaticResource topplayedTemplate}" IsSynchronizedWithCurrentItem="True"/>
    Il m'affiche bien un de éléments ("a1")...mais pas toute la liste ("a1","a2","a3",..)
    Pouvez-vous m'aider svp?

Discussions similaires

  1. [JAXB] Desérializer du xml vers une liste ou arraylist
    Par jamelledine_med dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 31/05/2009, 20h17
  2. Réponses: 2
    Dernier message: 12/07/2007, 09h34
  3. Creation ComboBox : comment la faire pointer vers une liste mofiable
    Par Henricoo dans le forum Macros et VBA Excel
    Réponses: 20
    Dernier message: 06/06/2007, 16h09
  4. Userform, TexBox, données vers une Liste
    Par skorpio dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 06/06/2007, 09h42
  5. [JDOM] [XPATH] Récuperer une liste d'attribut
    Par lil_k123 dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 31/05/2007, 16h10

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