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 :

[WPF] problème pour binder un treview avec un XDocument.


Sujet :

Windows Presentation Foundation

  1. #1
    maa
    maa est déconnecté
    Membre actif
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Points : 288
    Points
    288
    Par défaut [WPF] problème pour binder un treview avec un XDocument.
    Bonjour,

    Je cherche à afficher la structure suivante dans un treeview WPF :

    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
     
    <Root>
    	<Category>
    		<Name>category 1</Name>
    		<Item>
    			<Name>item 1</Name>
    		</Item>
    		<Item>
    			<Name>item 2</Name>
    		</Item>
    		<Category>
    			<Name>category 1.1</Name>
    			<Item>
    				<Name>item 1</Name>
    			</Item>
    		</Category>		
    	</Category>
    	<Category>
    		<Name>category 2</Name>
    		<Item>
    			<Name>item 1</Name>
    		</Item>
    	</Category>
    </Root>
    Je veux afficher le nom des category dans un certain style et le nom des item dans un autre style.
    Cet xml étant stocké dans un XDocument, j'utilise un HierarchicalDataTemplate pour décrire comment doivent s'afficher mes données dans le treeview. Voici le code XAML que j'ai écrit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <Window.Resources>
    	<HierarchicalDataTemplate DataType="Category" ItemsSource="{Binding Path=Elements[Item]}">
    		<TextBlock FontWeight="Bold" FontSize="20" Background="Red" Text="{Binding Path=Element[Name].Value}" />
    	</HierarchicalDataTemplate>
    	<DataTemplate DataType="Item">
    		<TextBlock FontStyle="Italic" Text="{Binding Path=Element[Name].Value}" />
    	</DataTemplate>
    </Window.Resources>
    <Grid>
    	<TreeView Margin="24,21,60,30" Name="treeView1" ItemsSource="{Binding Path=Root.Elements[Category]}" />
    </Grid>
    Mon problème est le suivant :
    De cette façon, le treeview n'affiche pas la "category 1.1". Normal car le path de la propriété ItemsSource du HierarchicalDataTemplate ne sélectionne que les éléments "Item". Si je le définie avec la valeur Elements, alors, les éléments <Name>...</Name> seront affichés tels quels dans le treeview. Je peux à la limite les masquer avec un dataTemplate, mais il restera toujours une ligne blanche. Il semble par ailleurs que l'on ne puisse pas séléctioner les éléments dont le nom est contenus dans une liste de valeur.
    Comment feriez-vous alors pour afficher ce type de hiérarchie ou il peut y avoir plusieurs type d'élément à un même niveau ?

    Merci d'avance pour votre aide,

    mathmax
    ****************************************

    - I don’t write plumbing code anymore
    - I use PostSharp
    - And you?


    ****************************************

  2. #2
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Tu as essayé de passer par Blend pour générer les DataTemplates correspondant ? Cela te permettra peut-être de voir comment Blend fait pour que cela fonctionne

  3. #3
    maa
    maa est déconnecté
    Membre actif
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Points : 288
    Points
    288
    Par défaut
    Je n'ai pas Blend. Mais as-tu une idée ?
    Je me disais aussi que c'est dômmage qu'on ne puisse pas utiliser des XPath sur les XElements dans le XAML. Ca résoudrait le problème...
    ****************************************

    - I don’t write plumbing code anymore
    - I use PostSharp
    - And you?


    ****************************************

  4. #4
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par maa Voir le message
    Je n'ai pas Blend. Mais as-tu une idée ?
    http://www.microsoft.com/expression/...=blend2preview

    Installe-le: il te fera gagner pas mal de temps

  5. #5
    maa
    maa est déconnecté
    Membre actif
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Points : 288
    Points
    288
    Par défaut
    J'ai installé Blend, mais je n'ai pas l'habitude de l'utiliser. Je suppose qu'on peut binder graphiquement les éléments d'un treeview à des objets et leur allouer un certain style en fonction de conditions sur les objets binder (dans mon cas une condition sur le name : si name == "Item" => Un hierrarchicalDataTemplate, si name == "Category" => Un autre hierrarchicalDataTemplate.) Il ne resterait plus qu'à regarder le code source généré. Le seul problème est que je n'ai aucune idée de comment faire ces binding graphiquement avec blend.
    ****************************************

    - I don’t write plumbing code anymore
    - I use PostSharp
    - And you?


    ****************************************

  6. #6
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par maa Voir le message
    (dans mon cas une condition sur le name : si name == "Item" => Un hierrarchicalDataTemplate, si name == "Category" => Un autre hierrarchicalDataTemplate.)
    Dans cec cas, il faut passer par un DataTemplateSelector. Regarde dans le BagOTrick de Kevin Moore: il y a un exemple

  7. #7
    maa
    maa est déconnecté
    Membre actif
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Points : 288
    Points
    288
    Par défaut
    Je ne vois pas comment ça pourrait marcher. Un DataTemplateSelector permet de sélectionner le bon template en fonction de propriété sur l'objet en cours, mais ne permet pas de décider si un objet doit afficher ou non.

    Dans mon cas, j'ai écris :

    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
     
        public class ElmtTemplateSelector : DataTemplateSelector
        {
            public override DataTemplate SelectTemplate(object item, DependencyObject container)
            {
                XElement elmt = (XElement)item;
     
                switch (elmt.Name.LocalName)
                {
                    case "Item":
                        return (DataTemplate)Application.Current.MainWindow.FindResource("ItemTemplate");
                    case "Category":
                        return (DataTemplate)Application.Current.MainWindow.FindResource("CategoryTemplate");
                    default:
                        return null;
                }
            }
        }
    et j'ai le XAML suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
        <Window.Resources>
            <app:ElmtTemplateSelector x:Key="eSelector" />
            <HierarchicalDataTemplate x:Key="CategoryTemplate" ItemsSource="{Binding Path=Elements}"  ItemTemplateSelector="{StaticResource eSelector}">
                <TextBlock Background="Green" Text="{Binding Path=Element[Name].Value}" />
            </HierarchicalDataTemplate>
            <DataTemplate x:Key="ItemTemplate">
                <TextBlock Background="Red" Text="{Binding Path=Element[Name].Value}" />
            </DataTemplate>
        </Window.Resources>
        <StackPanel>
            <TreeView Name="treeView1" ItemsSource="{Binding Path=Root.Elements[Category]}" ItemTemplateSelector="{StaticResource eSelector}"  />
        </StackPanel>
    Mais dans le cas où il s'agit d'un élément "<Name>", celui-ci se verra un template null par SelectTemplate() et sa réprésentation xml sera affichée dans le treeview alors que je voudrais que cette élément ne soit tous simplement pas affiché dans le treeview.
    ****************************************

    - I don’t write plumbing code anymore
    - I use PostSharp
    - And you?


    ****************************************

  8. #8
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par maa Voir le message
    Mais dans le cas où il s'agit d'un élément "<Name>", celui-ci se verra un template null par SelectTemplate() et sa réprésentation xml sera affichée dans le treeview alors que je voudrais que cette élément ne soit tous simplement pas affiché dans le treeview.
    Dans ce cas, essaye de rajouter un 3ème DataTemplate pour Name dans lequel tu met juste un TextBlock avec un Visibility == Collapsed. Ainsi, tu auras un DataTemplate mais celui-ci devrais ne rien afficher

  9. #9
    maa
    maa est déconnecté
    Membre actif
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Points : 288
    Points
    288
    Par défaut
    Malheureusement ça ne marche pas car j'ai une ligne blanche qui reste affiché dans le treeview.

    J'ai trouvé une autre solution. J'utilise une expression XPath dans le binding. XPath est beaucoup plus puissant que les 4 ou 5 PropertyDescriptors qui ont été rajoutés pour faire du binding sur les XElement. Malheureusement, XPath n'est pas utilisable sur un XDocument. Pourquoi ?? Je recopie donc le contenu de mon XDocument dans un XmlDocument et le tour est joué. Mais je perds toute notification de mon document d'origine. Dans mon cas, ça n'est pas grave, mais je ne comprends pas pourquoi XPath n'a pas été implémenté pour les XDocument... ou alors quelque chose m'échappe ?
    ****************************************

    - I don’t write plumbing code anymore
    - I use PostSharp
    - And you?


    ****************************************

Discussions similaires

  1. [JDOM] Problème pour lire les noeuds avec JDOM
    Par Eclix dans le forum Format d'échange (XML, JSON...)
    Réponses: 7
    Dernier message: 26/05/2014, 18h11
  2. [Upload] Problème pour gestion d'erreur avec class
    Par allserv dans le forum Langage
    Réponses: 2
    Dernier message: 27/12/2005, 13h00
  3. Réponses: 1
    Dernier message: 03/12/2005, 16h17
  4. problème pour faire un insert avec une image
    Par vbcasimir dans le forum Modules
    Réponses: 3
    Dernier message: 02/11/2005, 09h21
  5. Réponses: 1
    Dernier message: 17/05/2004, 11h29

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