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 :

Creation d'un HierarchicalDataTemplate à partir de TreeViewItem


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 163
    Par défaut Creation d'un HierarchicalDataTemplate à partir de TreeViewItem
    Bonjour,

    J'aimerais créer un HierarchicalDataTemplate par code à partir d'une instance de TreeViewItem (la source de données du TreeView est un fichier XML).
    L'idée c'est qu'après avoir modifié les propriétés graphiques d'un TreeViewItem (via une PropertyGrid) on mémorise le template pour l'appliquer plus tard dans un TreeView.

    Dans un premier temps je serialize dans une string l'object TreeViewItem:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    StringBuilder xamlString = new StringBuilder();
    XmlWriterSettings settings = new XmlWriterSettings();
    settings.Indent = true;
    settings.OmitXmlDeclaration = true;
    using (XmlWriter xmlWriter = XmlWriter.Create(xamlString, settings))
    {
        XamlDesignerSerializationManager dsm = new XamlDesignerSerializationManager(xmlWriter);
        dsm.XamlWriterMode = XamlWriterMode.Expression;
        XamlWriter.Save(myTreeViewItem, dsm);
        xmlWriter.Flush();
    }
    Puis, je reconstruit un DataTemplate:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    StringBuilder dataTemplateXaml = new StringBuilder();
    dataTemplateXaml.Append("<DataTemplate>\n");
    dataTemplateXaml.Append(xamlString.ToString());
    dataTemplateXaml.Append("\n</DataTemplate>");
    DataTemplate template = GetObject(dataTemplateXaml.ToString()) as DataTemplate;
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public static Object GetObject(string xaml)
    {
        MemoryStream stream = null;
        stream = new MemoryStream(Encoding.ASCII.GetBytes(xaml));
     
        ParserContext parserContext = new ParserContext();
        parserContext.XmlnsDictionary.Add("", "http://schemas.microsoft.com/winfx/2006/xaml/presentation");
        parserContext.XmlnsDictionary.Add("x", "http://schemas.microsoft.com/winfx/2006/xaml");
     
            return XamlReader.Load(stream, parserContext);
        }
    Enfin, je construit mon HierarchicalDataTemplate:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    HierarchicalDataTemplate hierarchicaltemplate = new HierarchicalDataTemplate(typeof(TreeViewItem));
    hierarchicaltemplate.ItemTemplate = template;
     
    Binding itemsSourceBinding = new Binding();
    itemsSourceBinding.XPath = "child::node()|attribute::*";
    hierarchicaltemplate.ItemsSource = itemsSourceBinding;
    Malheureusement, quand j'applique le HierarchicalDataTemplate via un template selector, le datatemplate ne s'applique pas (seul le toggle button apparait).
    En serializant le HierarchicalDataTemplate , j'obtient ceci:

    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
     
    <HierarchicalDataTemplate DataType="Folder">
                <HierarchicalDataTemplate.ItemTemplate>
                    <DataTemplate>
                        <TreeViewItem Background="Blue">
                            <TreeViewItem.ItemTemplate>
                                <DataTemplate>
                                    <StackPanel Orientation="Horizontal">
                                        <TextBlock Text="{Binding XPath=@Header}" />
                                    </StackPanel>
                                </DataTemplate>
                            </TreeViewItem.ItemTemplate>
                        </TreeViewItem>
                    </DataTemplate>
    </HierarchicalDataTemplate.ItemTemplate>

  2. #2
    Membre éclairé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Par défaut
    Bonjour al2000,

    Si j'ai compris, tu veux lorsque tu tombes sur un type Folder afficher un TreeviewItem avec un Header portant le nom du dossier ?
    Si c'est cela, essaie en modifiant ton hierarchicaldatatemplate de façon à ce qu'il donne une truc du style

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <HierarchicalDataTemplate DataType="{x:Type model:Folder}">
    	<TreeViewItem Background="Blue" Header="{Binding Path=DirectoryName}"/>		
    </HierarchicalDataTemplate>

    Bon après à adapter en fonction de tes besoins mais avais-tu testé le tien "en dur" dans ton xaml pour voir si l'affichage était correct ?

    En espérant t'avoir aidé ^^

    @+

Discussions similaires

  1. Réponses: 33
    Dernier message: 12/04/2006, 19h12
  2. Creation d'objet a partir d'un fichier - espace de nom -
    Par LLEJEUNE1 dans le forum Général Python
    Réponses: 2
    Dernier message: 05/04/2006, 12h13
  3. [PDE] Creation de vues a partir d'une autre vue
    Par indoloic dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 13/03/2006, 14h34
  4. Creation d'une chaine à partir d'un tuple
    Par Bayard dans le forum Général Python
    Réponses: 2
    Dernier message: 19/01/2006, 11h25
  5. Réponses: 18
    Dernier message: 08/08/2005, 20h52

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