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 :

[MVVM] TabControl et ViewModel


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 [MVVM] TabControl et ViewModel
    Bonjour à tous,

    Voici la suite de mon précédent post (gestion des usercontrols).
    J'utilise désormais la MVVM Light Toolkit de Galasoft.

    Mon application est décomposée ainsi
    - 1 View principale reliée
    - 2 Views sous format de UserControl

    Ma View principale possède un menu (Action 1, Action 2). et un grid :

    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
     
    <Grid x:Name="LayoutRoot">
       <Grid>       
          <Menu  Name="Choix"  HorizontalAlignment="Left" VerticalAlignment="Top"  BorderThickness="2">
             <MenuItem Header="Choix">
                <MenuItem Header="View1" Command="{Binding ChangeToView1}" />
                <MenuItem Header="View2" Command="{Binding ChangeToView2}"/>
             </MenuItem>
         </Menu>
       </Grid>
     
       <Grid  Margin="0,30,0,0">             
          <ContentControl Content="{Binding MaVmSelect}" Margin="0,20" />
       </Grid>

    En gros, lors du choix, la propriété MaVmSelect sur la ViewModel principale est changée et donc, j'affiche la bonne View correctement bindée...

    Aujourd'hui, mon objectif est d'ouvrir ce UserControl dans un TabControlItem.
    Et c'est là que je sèche... Je pense pouvoir réutiliser mes DataTemplates afin de respecter au max le pattern

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <DataTemplate  DataType="{x:Type vm:ViewModel1}">
       <v:View1/>
    </DataTemplate>
    <DataTemplate  DataType="{x:Type vm:ViewModel2}">
       <v:View2/>
    </DataTemplate>

    Si quelqu'un avait une idée pour la suite...

    Merci d'avance

  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
    Bon j'avance sur le sujet...
    J'ai créé une collection sur ma ViewModel principal contenant des ViewModels tel que

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    VmCollect.Add(new ViewModel1());
    VmCollect.Add(new ViewModel2());

    En définissant un DataTemplate sur le <TabControl.ItemTemplate> j'arrive à afficher mes deux onglets.

    Seulement voilà, je voudrais que le client puisse ajouter des onglets à la volée.
    Par exemple, s'il clic sur un bouton, un nouveau onglet apparaît avec la ViewModel1 comme template par exemple...

    Comment faire pour chaque view ait une instance indépendante des autres ?

    Par avance, merci de votre aide !!

  3. #3
    Membre éprouvé
    Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2009
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 99
    Par défaut
    Tu peux essayer d'utiliser un ContentControlSelector qui choisira quel DataTemplate utiliser.
    http://msdn.microsoft.com/fr-ca/libr...eselector.aspx

  4. #4
    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
    merci pour ton lien...
    en fait en réutilisant mon ancien bout de code, moyennant quelques modifications j'ai réussi à obtenir un truc convenable...
    seul hic, lorsque j'ouvre un onglet de type ViewModel1 (la View1 est chargée dans un nouveau tabitem), le client a la possibilité de de refaire la même opération....

    On se retrouver alors avec 2 onglets avec deux View1 à l'intérieur.. seul hic, on utilise qu'une seule instance de la ViewModel1 alors que j'aimerais en avoir deux par exemple .....
    C'est ça que je n'arrive pas à gérer !!

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par koyot3 Voir le message
    merci pour ton lien...
    en fait en réutilisant mon ancien bout de code, moyennant quelques modifications j'ai réussi à obtenir un truc convenable...
    seul hic, lorsque j'ouvre un onglet de type ViewModel1 (la View1 est chargée dans un nouveau tabitem), le client a la possibilité de de refaire la même opération....

    On se retrouver alors avec 2 onglets avec deux View1 à l'intérieur.. seul hic, on utilise qu'une seule instance de la ViewModel1 alors que j'aimerais en avoir deux par exemple .....
    C'est ça que je n'arrive pas à gérer !!
    Je pense que le problème n'est bien expliqué là.

    Est ce que tu veux dire :

    Comment faire pour ne pas créer un TabItem correpondant à un ViewModel si au moins un TabItem lui est déjà associé dans le TabControl ?

  6. #6
    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
    En fait, oui je pense que je me suis mal expliqué...

    Si j'ai bien compris le principe, 1 ViewModel = 1 View...
    Dans mon cas, j'ai 2 ViewModels qui correspondent à 2 UserControls

    Quand je clique sur un bouton, j'ai le UserControl1 qui s'insère dans un TabItem de mon TabControl. Jusqu'à là tout marche nickel !

    Le hic, c'est que si je reclique sur le même bouton, un deuxième TabItem se rajoute avec le même UserControl. Ca c'est le comportement attendu.

    Mais mes deux UserControls pointent vers le même ViewModel : ce qui fait que quand je modifie une valeur sur le 1er, elle est répercutée sur le 2ème...

    Exemple :
    Model1 :
    une propriété Nom

    ViewModel1 :
    une propriété qui retourne un objet Model1

    View1 :
    une textblock bindée sur le nom de l'objet Model1 renvoyé par ViewModel1

    View1 n°2 :
    même composant que la précédante. Or si je change le nom ici, ça le change dans l'autre, ce qui parait normal.

    J'imaginerais donc une solution pour créer une collection d'objet dans ma ViewModel mais comment faire pour dire que lors du binding on pointe vers tel ou tel objet ?
    Stocker le nombre d'onglet en cours et créer une propriété qui renvoie l'objet à l'index suivant dans la collection ?

    Merci d'avance !!

Discussions similaires

  1. [WPF - MVVM] Communications entre ViewModels
    Par NeoKript dans le forum Windows Presentation Foundation
    Réponses: 9
    Dernier message: 06/02/2012, 14h06
  2. MVVM TabControl, TabItem, UserControl
    Par mathrb dans le forum Windows Presentation Foundation
    Réponses: 6
    Dernier message: 25/08/2010, 21h20
  3. [MVVM] Binding à un ViewModel depuis le code-behind
    Par Gigi070 dans le forum Windows Presentation Foundation
    Réponses: 23
    Dernier message: 29/03/2010, 17h46

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