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 :

DataTemplate d'une ListBox dans un UserControl


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Lelio1407
    Inscrit en
    Juillet 2009
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 126
    Par défaut DataTemplate d'une ListBox dans un UserControl
    Bonjour,

    Je dois créer une application qui me permet de construire une IHM,

    1 - J'ai crée un UserControl "ScreenBaseInfos" qui contient, entre autre, une ListBox.

    Cette ListBox est "bindée" à une collection d'objets graphiques, "ScreenBaseObjectsCollection", qui représente les éléments de mon IHM.

    Ces objets graphiques peuvent être des images ou des textes : suivant leur type, ils sont affichés differemment dans la ListBox grâce aux DataTemplates (Une image pour les images, un texte pour les textes..)

    2 - Seulement, ces objets graphiques appartiennent également à une page graphique. Ils possèdent donc une propriété "GraphicObject_PageInfo" = "Background" ou Foreground".

    Au niveau de l'interface, je crée donc deux instances de mon UserControl "ScreenBaseInfos", une pour contenir les objets graphiques possédant la propriétés "Background" et l'autre pour contenir les objets graphiques possédant la propriétés "Foreground".

    J'ai donc rajouté également une propriété "ScreenBaseInfos_PageInfo" à "ScreenBaseInfos" informée au moment de la création de mes instances.

    Ces deux instances sont donc "bindées" à la même collection d'objets graphiques.

    Ce que je souhaite, c'est que si la propriété "ScreenBaseInfos_PageInfo" = "Background", seuls les objets graphiques (images ou textes) de la collection possédants la propriété "GraphicObject_PageInfo" = "Background" soient affichées dans ma ListBox (idem pour la deuxième instance "Foreground").

    En gros, j'ai l'impression que sur ma classe de base, "ScreenBaseInfos", j'ai déjà un dataTemplateSelector pour la ListBox mais lorsque je crée des instances, il faut que je surcharge ces dataTemplates en fonction d'une propriété du "contenant" de la ListBox...

    Et ça, je sais pas faire...

    Je vous remercie si vous m'avez lu jusqu'au bout...

    Je vous remercie d'avance pour votre aide.

  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
    Salut,

    Si j'ai bien compris (c'est dur le matin ) tu as une collection d'objets que tu veux séparer en deux selon une propriété ScreenBaseInfos_PageInfo ?

    Si c'est le cas, tu n'as qu'a créer deux collections dans ta ViewModel, une contenant la collection avec les Background et la deuxième avec les Foreground. De plus, comme les deux catégories ne seront jamais mélangées, tu peux virer ton DataTemplateSelector et n'utiliser qu'un datatemplate de base pour chaque listbox.

    Sinon si tu veux faire plus propre, tu peux mettre en place un filtre sur ta collection.
    Voici un liens qui t'expliquera mieux que moi
    lien 1 (partie sur Filtering)

    En espérant que ça t'aide...

    @+

  3. #3
    Membre confirmé Avatar de Lelio1407
    Inscrit en
    Juillet 2009
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 126
    Par défaut
    Bonjour,

    Merci pour ta réponse.

    Concernant la première solution, je ne souhaite pas créer deux listes car les ListBoxes contenues dans les deux instances de mon UserControl doivent être "bindées" sur la même collection (celle de mon écran d'IHM qui contient tous les éléments de ma vue principales). Car si je vais des opérations sur cette dernière (add (picture ou text), delete, sort, etc...), ces modifications doivent être automatiquement répercutées dans les deux ListBoxes d'infos "Background" et "Foreground" (et inversement).

    Je vais donc aller regarder du coté de l'ObjectCollectionView, qui à première vue, me semble correspondre à ce que je recherche.

    Bonne journée!

  4. #4
    Membre confirmé Avatar de Lelio1407
    Inscrit en
    Juillet 2009
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 126
    Par défaut Surcharge d'un dataTemplate.
    Bonjour,

    J'affine un peu la demande faite dans mon précédent post car je n'arrive pas à trouver de solution à mon problème.

    Je dois créer une application qui me permet de construire une IHM,

    J'ai crée un UserControl "ScreenBaseInfos" qui contient, entre autre, une ListBox.

    La ListBox est "bindée" à une collection d'objets graphiques, "ScreenBaseObjectsCollection", qui représente les éléments de mon IHM.

    Ces objets graphiques peuvent être des images ou des textes : suivant leur type, ils sont affichés differemment dans la ListBox grâce aux DataTemplates (Une image pour les images, un texte pour les textes..)


    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <UserControl>
        <StackPanel>
            <Border>
                <Label Name="IHM_ScreenBaseInfos_HeaderLabel"/>
            </Border>
            <ListBox Name="DBE_ScreenBaseInfos_ListBox" ItemsSource="{Binding}"
                    ItemsPanel="{StaticResource ScreenBaseInfos_ItemsPanelTemplate}" 
                    ItemTemplateSelector="{StaticResource ScreenBaseInfos_DataTemplateSelector}"/>
        </StackPanel>
    </UserControl>


    Seulement, ces objets graphiques appartiennent également à une page graphique. Ils possèdent donc une propriété "GraphicObject_PageInfo" = "Background" ou Foreground" et je souhaite visualiser leurs infos dans deux UserControls différents.

    Dans mon application principale, uu niveau de l'interface, je crée donc deux instances de mon UserControl "ScreenBaseInfos", une pour contenir les objets graphiques possédant la propriétés "Background" et l'autre pour contenir les objets graphiques possédant la propriétés "Foreground".

    J'ai donc rajouté également une propriété "ScreenBaseInfos_PageInfo" à "ScreenBaseInfos" informée au moment de la création de mes instances.

    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <DockPanel>
           <dbe:ScreenBaseInfos Name="ScreenBaseBackgroundInfos_UserControl" 
           ScreenBaseInfos_PageInfo="Background"/>
           <dbe:ScreenBaseInfos Name="ScreenBaseForegroundInfos_UserControl" 
           ScreenBaseInfos_PageInfo="Foreground"/>
    </DockPanel>

    Ces deux instances sont donc "bindées" à la même collection d'objets graphiques.

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ScreenBaseBackgroundInfos_UserControl.DataContext = CurrentScreenBase.ScreenObjectsCollection;
    ScreenBaseForegroundInfos_UserControl.DataContext = CurrentScreenBase.ScreenObjectsCollection;

    Dans ScreenBaseBackgroundInfos_UserControl, je ne veux afficher que les ScreenObjects possédand la propriété "Background" (idem pour ScreenBaseForegroundInfos_UserControl).

    Comment faire cela? J'ai bien regardé du coté des ObjectCollectionView, mais je n'ai pas vu comment les utiliser dans ce cas...

    Je vous remercie d'avance!!

  5. #5
    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,

    En gros tu dois faire deux tris sur la même collection, donc ce qui revient à mettre en place deux filtres.

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //pour les composants background
    ListCollectionView _backgroundView = new ListCollectionView(CurrentScreenBase.ScreenObjectsCollection);
    _backgroundView.Filter = BackgroungFilter;
     
    //pour les composants foreground
    ListCollectionView _foregroundView = new ListCollectionView(CurrentScreenBase.ScreenObjectsCollection);
    _foregroundView.Filter = ForegroundFilter;
     
    //ton code de base
    ScreenBaseBackgroundInfos_UserControl.ItemsSource= CurrentScreenBase.ScreenObjectsCollection;
    ScreenBaseForegroundInfos_UserControl.ItemsSource= CurrentScreenBase.ScreenObjectsCollection;

    Maintenant il te faut rédiger les méthodes pour les tris :

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     private bool BackgroungFilter(object item)
            {
                TestClass t = item as TestClass;
                return (t.Condition == 0);
            }
     
     private bool ForegroundFilter(object item)
            {
                TestClass t = item as TestClass;
                return (t.Condition == 1);
            }

    Dans mon exemple je me sers d'une classe de test avec une propriété comme test. A toi de l'adapter à ton code....

    Si tu as besoin de rafraichir tes filtres tu le fais avec un .Refresh() sur tes ListCollectionViews.

    En espérant que cela t'aide...

    @+

  6. #6
    Membre confirmé Avatar de Lelio1407
    Inscrit en
    Juillet 2009
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 126
    Par défaut
    Dans mon exemple je me sers d'une classe de test avec une propriété comme test. A toi de l'adapter à ton code....
    Juste une dernière précision, comment est que je fais le lien entre l'instance en XAML et ma méthode de tri? Dans le code XAML, je rajoute la propriété de tri? Par exemple :
    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <DockPanel>
           <dbe:ScreenBaseInfos Name="ScreenBaseBackgroundInfos_UserControl" 
           ScreenBaseInfos_PageInfo="Background" CollectionTriBackground="CollectionTriBackground"/>
           <dbe:ScreenBaseInfos Name="ScreenBaseForegroundInfos_UserControl" 
           ScreenBaseInfos_PageInfo="Foreground" CollectionTriForeground="CollectionTriForeground"/> 
    </DockPanel>

    En bref, J'ai bien compris le principe et le code mais un peu moins bien le lien avec mes instances et la déclaration en XAML.

    Merci de ton aide!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. PB d'affichage d'une listbox dans Access
    Par Tybox dans le forum IHM
    Réponses: 3
    Dernier message: 19/12/2007, 14h54
  2. Récupérer la valeur d'une listbox dans une fonction javascript
    Par skyangel20 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 09/10/2007, 10h51
  3. Inserer le contenu d'une listbox dans une feuille
    Par PascGuil dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 09/08/2007, 16h13
  4. Comment récuperer une listbox dans un UserControl?
    Par 404error dans le forum ASP.NET
    Réponses: 2
    Dernier message: 13/03/2007, 08h31
  5. Photo à partir d'une listbox dans formulaire
    Par alex.a dans le forum IHM
    Réponses: 17
    Dernier message: 17/05/2006, 09h50

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