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 :

HierachicalDataTemplate Dans un ItemsControl


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    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
    Par défaut HierachicalDataTemplate Dans un ItemsControl
    Bonjour J'ai en gros le modèle de données suivant :

    Code c# : 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
     
     
    class ZoneAnimation
    {
    }
     
    class Zone
    {
         List<ZoneAnimation> ZoneAnimations
         double X;
         double Y;
         double Width;
         double Height;
    }
     
    class Model
    {
         List<Zone> Zones;
    }

    J'essaye d'afficher toutes les ZoneAnimation de mon Modele sur un canvas.

    pour cela je fais la chose suivante

    Code xaml : 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
     
    <Canvas Background="Black" Width="1920" Height="1200">
         <ItemsControl ItemsSource="{Binding Model.Zones}">
             <ItemsControl.ItemTemplate>
                  <HierarchicalDataTemplate ItemsSource="{Binding ZoneAnimations}">
                        <Canvas>
                             <Grid Canvas.Left="{Binding X}" Canvas.Top="{Binding Y}" Width="{Binding Width}" Height="{Binding Height}">
                                 <Border BorderBrush="White" BorderThickness="1"/>
                             </Grid>
                        </Canvas>
                        <HierarchicalDataTemplate.ItemTemplate>
                             <DataTemplate>
                                   <Grid Width="200" Height="200" Background="Blue" />
                             </DataTemplate>
                         </HierarchicalDataTemplate.ItemTemplate>
                    </HierarchicalDataTemplate>
                 </ItemsControl.ItemTemplate>
               </ItemsControl>
          </Canvas>

    Mais autant j'ai bien le cadre blanc, autant je ne vois jamais de bleu.
    Comment faire ?

    D'avance merci,

  2. #2
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 22
    Par défaut
    Bonjour,

    Je vois 2 solutions :
    1. Comme la liste peut contenir 2 types d'objet il te faut un "itemtemplateselector" (tu obtiens alors les objets les un en dessous des autres)
    (voir un billet de Thomas Lebrun intitulé [WPF] Comment changer le template d'un contrôle en fonction de ses données ?)

    2. ou si tu veux que les cadres bleus soient dans le cadre blanc, il ne faut pas utiliser de HierarchicalDataTemplate mais un Datatemplate simple dans lequels tu ajoutes un itemscontrol dont la itemsSource est ZoneAnimations.

    Aurore

  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 : 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
    Par défaut
    Le HierarchicalDataTemplate est fait pour s'utiliser avec des contrôles hiérarchiques (TreeView ou Menu par exemple). ItemsControl n'a pas cette notion de hiérarchie, il ne prévoit donc aucun emplacement pour afficher les "sous-éléments".

    Le plus simple, ce serait de mettre dans le DataTemplate de Zone un autre ItemsControl pour afficher les ZoneAnimations.

    Citation Envoyé par AeTRC Voir le message
    1. Comme la liste peut contenir 2 types d'objet il te faut un "itemtemplateselector" (tu obtiens alors les objets les un en dessous des autres)
    (voir un billet de Thomas Lebrun intitulé [WPF] Comment changer le template d'un contrôle en fonction de ses données ?)
    Ce n'est pas ça le problème : à un "niveau" donné, il n'y a qu'un seul type d'objet. La collection de ZoneAnimation est à un niveau inférieur, imbriqué dans la Zone. Donc au final il n'y a jamais de collection hétérogène, et le ItemTemplateSelector ne sert à rien

  4. #4
    Membre éclairé
    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
    Par défaut
    Bonjour, et merci pour vos réponses

    En gros j'ai fait ça :

    Code xaml : 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
    <Canvas Background="Black" Width="1920" Height="1200">
         <ItemsControl ItemsSource="{Binding Model.Zones}">
             <ItemsControl.ItemTemplate>
                  <DataTemplate>
                        <Canvas>
                             <Grid Canvas.Left="{Binding X}" Canvas.Top="{Binding Y}" Width="{Binding Width}" Height="{Binding Height}">
                                 <Border BorderBrush="White" BorderThickness="1"/>
                                 <ItemsControl ItemsSource="{Binding ZoneAnimations}">
                                      <ItemsControl.ItemTemplate>
                                           <DataTemplate>
                                                  <Canvas>
                                                  <Grid Width="200" Height="200" Background="Blue" />
                                                  </Canvas>
                                         </DataTemplate>
                                     </ItemsControl.ItemTemplate>
                                 </ItemsControl>
                             </Grid>
                         </Canvas>
                     <DataTemplate>
                  </ItemsControl.ItemTemplate>
               </ItemsControl>
          </Canvas>

    et ca affiche bien ce que j'ai programmé.
    Comme je voulais que ma grille bleue (représentant une zoneAnimation), ait sa largeur et hauteur bindée sur celles de la Zone qui le contient, j'ai rajouté une propriété ZoneOwner (de type Zone) dans ma classe ZoneAnimation
    et j'ai modifé le code comme ceci :
    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    <Grid Width="{Binding ZoneOwner.Width}" Height="{Binding ZoneOwner.Height}" Background="Blue" />

    Ca marche bien, mais est-on obligé de passer par une propriété ZoneOwner, ou bien y-a-t'il plus propre ? (find ancestor, ou que sais-je ...)

    Car il se pourrait qu'une ZoneAnimation soit référencé dans plusieurs Zones à la fois, et là l'astuce ne fonctionne plus.

Discussions similaires

  1. [WPF] Gestion du parent logique d'un item dans un ItemsControl
    Par Taenad dans le forum Windows Presentation Foundation
    Réponses: 10
    Dernier message: 15/12/2017, 01h02
  2. [C#][WPF] Accéder à un bouton dans le datatemplate d'un itemscontrole
    Par bensra dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 13/08/2011, 01h10
  3. command dans un ItemsControl
    Par johnaliashead dans le forum Silverlight
    Réponses: 3
    Dernier message: 09/09/2010, 17h29
  4. [Xaml] Lier un Itemscontrol à une StringCollection définie dans les user settings
    Par FRED.G dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 07/03/2009, 11h33
  5. [WPF] Problème de WrapPanel dans un ItemsControl
    Par Asarnil dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 03/03/2009, 09h03

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