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 :

Bonne méthode pour réaliser de l'héritage/template [MVVM]


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 32
    Par défaut Bonne méthode pour réaliser de l'héritage/template
    Bonjour, j'aurais besoin de conseils pour poursuivre mon développement actuel avec une bonne méthodologie.

    Pour éviter de rentrer dans les détail, je simplifie mon énoncé :
    Je développe en MVVM, j'ai une vue principale qui permet de superviser à distance un train radio commandé ()...

    Le train a 3 wagons, dans ma vue, on modélise donc une motrice et ses 3 wagons + quelques dessins autour pour avoir quelque-chose de joli.

    La motrice c'est un user control : UcMotrice.
    Les wagons ce sont aussi des user control du type : UcWagon.

    Dans le ViewModel, on peut faire (en appelant des relayCommand) :
    Démarrer/Stopper la motrice.
    Accéder à un écran qui détaille mieux la motrice (en cliquant sur l'UcMotrice).
    D'autres actions spécifiques à la motrice (appelables depuis l'UcMotrice).
    Allumer/Eteindre un wagon.
    Accéder à un écran qui détaille mieux un wagon (en cliquant sur un UcWagon).
    D'autres actions spécifiques à un wagon (appelables depuis un UcWagon).
    ...

    Jusqu'à maintenant, j'ai remarqué que le MVVM était pas trop fait pour l'héritage, voici mon besoin :
    Je vais avoir d'autres types de train :
    Imaginons que j'ai un train avec une motrice (même type de motrice) et 5 wagons (même type de wagon).

    Comment puis-je développer ça élégamment tout en prenant en compte que j'utilise Expression Blend pour le Développement (je dis ça car certains template sont mal/non gérés dans Blend (genre les tooltip ajoutées en template sur certains contrôles WPF)) ????

    A première vue, je mettrait bien ma motrice + les Wagons + les dessins qui vont avec dans un UcTrainTypeA. Je créé ensuite un UcTrainTypeB avec sa motrice et ses 6 wagons, vu que les dessins sont différents et que les wagons doivent être disposés différemment vaudrait mieux faire 2 Uc différents.

    Le soucis ensuite, c'est comment on agence/déclare ça dans la vue ?
    j'ai lu des choses sur les customControl, mais je suis pas sûr que ça soit bien adapté.
    l'idéal serait qu'on lise un paramètre dans l'app.config qui renseigne le type de train direct au constructeur du ViewModel.
    Comme ça on charge direct l'Uc du type de train voulu dans la vue.
    Puis dans Expression Blend, le bon Uc est chargé direct dans la vue en design...

    Mais bon, je vois pas trop comment faire, je suppose un truc de template direct dans le XAML ???

    Si vous avez tenu le coup jusqu'ici, merci d'avance pour vos conseils .
    Des conseils pour ce "truc de template direct dans le XAML" ?
    Une meilleure idée qui résolve ma problématique ?

  2. #2
    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
    Salut,

    Jusqu'à maintenant, j'ai remarqué que le MVVM était pas trop fait pour l'héritage
    Qu'est ce qui te pose problème ? es-tu sur que cela vienne de l'utilisation de MVVM ?

    Sinon, pour répondre à ta question, le mieux serait d'utiliser ce genre de chose :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <DataTemplate DataType="{x:Type ViewModels:WagonViewModel}">
               <Views:UcWagon />
    </DataTemplate>
     
    <DataTemplate DataType="{x:Type ViewModels:MotriceViewModel}">
               <Views:UcMotrice />
    </DataTemplate>

    Cela te permets d'associer une vue directement en fonction du type de son contexte (ton VM en gros). De mémoire, Blend prend en compte cette syntaxe correctement.

    Tu peux aussi regarder du côté du DataTemplateSelector.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 32
    Par défaut
    Citation Envoyé par Lordinaire Voir le message
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <DataTemplate DataType="{x:Type ViewModels:WagonViewModel}">
               <Views:UcWagon />
    </DataTemplate>
     
    <DataTemplate DataType="{x:Type ViewModels:MotriceViewModel}">
               <Views:UcMotrice />
    </DataTemplate>
    Tu peux aussi regarder du côté du DataTemplateSelector.
    Bonsoir, je me remet à cette problématique.
    Si je comprend bien, l'utilisation des datatemplate et DataTemplateSelector/ItemTemplateSelector permet de manipuler une liste de contrôles (héritant d'un type commun) pouvant avoir différent types ou différents styles.

    Pour ma problématique, ce n'est pas une liste de contrôles dont j'ai besoin. J'ai juste besoin d'afficher un user contrôle différent (dans un endroit précis) en fonction du type d'objet traité dans ma vue.
    Et que ceci soit spécifiable si possible depuis le xaml.

    Pourriez vous éclairer ma lanterne ???

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 52
    Par défaut
    Bonjour,
    Non comme tu peux le voir dans l'exemple donné par Lordinaire le contentpresenter va afficher la vue (qui est un usercontrol en général) correspondant au viewmodel qui sera instancié.

    Je t'ai fais un petit exemple pour mieux comprendre. Il y'a une listbox contenant deux viewmodel lorsque tu en sélectionnes un ça affichera la vue correspondante.
    Fichiers attachés Fichiers attachés

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 32
    Par défaut
    Citation Envoyé par sfxzeus Voir le message
    Bonjour,
    Non comme tu peux le voir dans l'exemple donné par Lordinaire le contentpresenter va afficher la vue (qui est un usercontrol en général) correspondant au viewmodel qui sera instancié.

    Je t'ai fais un petit exemple pour mieux comprendre. Il y'a une listbox contenant deux viewmodel lorsque tu en sélectionnes un ça affichera la vue correspondante.
    Merci, je regarde ça, là je suis en train d'essayer d'utiliser les DataTemplate et un DataTemplate selector pour mettre le bon user control dans un contentControl vu que lui par rapport à la listBox, il n'héberge qu'un objet.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 52
    Par défaut
    Citation Envoyé par uluquiorra Voir le message
    Merci, je regarde ça, là je suis en train d'essayer d'utiliser les DataTemplate et un DataTemplate selector pour mettre le bon user control dans un contentControl vu que lui par rapport à la listBox, il n'héberge qu'un objet.
    Oui mais non en faite la listbox c'était juste pour te montrer le changement entre deux viewmodels.

    Il n'ya pas besoin de DataTemplate selector. Il s'uffit que tu instancie ViewModel1 dans DetailViewModel pour que le ContenControl t'affiche la vue correspondante.

    En clair tu pourrais avoir un bouton avec une command qui t'instancie un viewModel3 dans detailViewModel et il serait affiché.

    Le code important en xaml c'est:
    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     <ContentPresenter Content="{Binding DetailViewModel}" Grid.Column="1">
                <ContentPresenter.Resources>
                    <DataTemplate DataType="{x:Type ViewModel:ViewModel1}">
                        <View:View1/>
                    </DataTemplate>
                    <DataTemplate DataType="{x:Type ViewModel:ViewModel2}">
                        <View:View2/>
                    </DataTemplate>
                </ContentPresenter.Resources>
            </ContentPresenter>

    Content contient le viewmodel en cours et le dataTemplate selon le type de Content va t'afficher la vue correspondante.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 23/04/2008, 16h41
  2. Réponses: 2
    Dernier message: 14/03/2008, 10h57
  3. Réponses: 7
    Dernier message: 06/08/2007, 20h28
  4. Bonne méthode pour parser mon xml
    Par scaleo dans le forum Windows Forms
    Réponses: 2
    Dernier message: 09/07/2007, 10h04
  5. Réponses: 2
    Dernier message: 22/08/2006, 09h28

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