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] gestion des UserControls


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] gestion des UserControls
    Bonjour à tous,

    Je continue actuellement des différents tests avec le fameux pattern MVVM.
    Aujourd'hui, pour bien commencer la semaine, j'ai une question sur la gestion des UserControls UC.

    En effet mon application est faite de la sorte :
    1 View MainWindowsV bindée sur la ViewModel MainWindowsVM
    1 UC uc1V bindé sur uc1VM
    1 UC uc2V bindé sur uc2VM

    Dans ma MainWindowsV, j'ai un menu qui retourne avec une command le choix dans un menu. J'aimerais réussir à lui faire afficher l'UC 1 ou le 2 en fonction du choix dans le menu..

    J'ai donc pensé à faire hériter toutes les ViewModel d'une interface classique et dans la ViewModel de ma page principale, avoir une propriété telle que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     protected IViewModel _MaVue;
            public readonly IViewModel MaVue()
            {
                return _MaVue;
            }
    A partir de là, plusieurs questions :
    -déjà est ce le bon raisonnement ?
    - la VM de base doit donc posséder toutes les instances en cours des autres VM afin de pouvoir garder les données saisies ?
    -comment gérer le binding pour afficher le bon UC

    Par avance, merci pour ceux qui répondront !

    @+

  2. #2
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    C'est pas tout à fait ca, mais on s'en approche! Voila ce que je te suggère:
    Ton interface:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public interface IViewModel
    {
        UserControl View { get; }
    }
    Ton MainViewModel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class MainViewModel : INotifyPropertyChanged
    { ...BLABLABLA...
        private IViewModel _selectedViewModel;
        public IViewModel SelectedViewModel
        {
             get { return _selectedViewModel; }
             set { _selectedViewModel = value; //Ajouter ici le code pour NotifyPropertyChanged }
        }
        ...BLABLABLA ENCORE ...
    }
    En fonction de ton choix tu peux affecter a SelectedViewModel l'un ou l'autre des viewmodel. A ce propos, oui tu dois garder une référence vers tes viewmodel sauf si tu utilises un ServiceLocator (Unity, MEF, ou a la main)

    L'utilisation dans le XAML:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <ContentControl Content="{Binding SelectedViewModel}" />

  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 : 44
    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
    +1 pour la réponse de PitMaverick, sauf qu'il en manque un bout

    Pour que ça marche, il faut définir un DataTemplate pour chaque type de ViewModel pour l'associer au UserControl correspondant (pour que le ContentControl sache quelle vue utiliser pour un ViewModel donné)

    Par contre, oublie ton idée d'avoir une propriété MaVue : le ViewModel ne doit pas avoir connaissance de la vue, c'est un des principes de base de MVVM

  4. #4
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Citation Envoyé par tomlev Voir le message
    +1 pour la réponse de PitMaverick, sauf qu'il en manque un bout

    Pour que ça marche, il faut définir un DataTemplate pour chaque type de ViewModel pour l'associer au UserControl correspondant (pour que le ContentControl sache quelle vue utiliser pour un ViewModel donné)

    Par contre, oublie ton idée d'avoir une propriété MaVue : le ViewModel ne doit pas avoir connaissance de la vue, c'est un des principes de base de MVVM
    Ben en fait, j'utilise souvent ce système qui m'a déjà sorti plusieurs fois d'embuches. Après la nuance c'est que le ViewModel n'a pas connaissance de l'implémentation de la vue. Généralement l'implémentation est un truc du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UserControl View { get { return ViewFactory.GetView<IView>(); } }
    (et dans mon cas ViewFactory.GetView est UnityContainer.Resolve)

  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
    Merci pour vos réponses.

    En fait j'ai utilisé un mix des deux on va dire

    J'ai une propriété dans ma ViewModel principale

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    protected IViewModel _MaVm;
    public IViewModel MaVm
    {
      set
      {
       _MaVm = value;
       PropertySetter("MaVm");
      }
      get { return  _MaVmm; }
      }
    qui me retourne la ViewModel sélectionnée, enfin celle à afficher...

    Pour ce qui concerne les resources


    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <Window.Resources>
            <DataTemplate  DataType="{x:Type local2:MaViewModel}">
                <local:View1/>
            </DataTemplate>
            <DataTemplate  DataType="{x:Type local2:MaViewModel2}">
                <local:View2/>
            </DataTemplate>  
     
            <local2:MaMainViewModel x:Key="MyVM"/>
     
        </Window.Resources>

    et pour afficher le bon UserCOntrol,

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <ContentControl Content="{Binding MaVm}" BorderThickness="3" Margin="20">

    Cela vous paraît correct au niveau respect du pattern ?
    N'hésitez pas si vous voyez d'éventuelles améliorations (pour l'instant ça fonctionne mais bon )

    Par avance, merci

    @+

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

    Je me permets de revenir sur ce post car j'ai un autre problème : à chaque fois que ma View change, automatiquement une nouvelle instance de la ViewModel est générée et donc je perd les données saisies par exemple.

    Comment puis-je faire pour conserver les premières instances ?

    Par avance, merci de votre aide

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

Discussions similaires

  1. [Débutant] WinForm avec 2 UserControl Custom et gestion des évènements
    Par Cyryior dans le forum C#
    Réponses: 0
    Dernier message: 01/08/2011, 01h09
  2. Gestion des events dans un usercontrol
    Par Aidenam dans le forum Windows Forms
    Réponses: 4
    Dernier message: 02/05/2009, 21h05
  3. Gestion des évennements dans un UserControl
    Par CUCARACHA dans le forum ASP.NET
    Réponses: 3
    Dernier message: 20/06/2008, 10h48
  4. Réponses: 4
    Dernier message: 04/07/2002, 12h31
  5. c: gestion des exceptions
    Par vince_lille dans le forum C
    Réponses: 7
    Dernier message: 05/06/2002, 14h11

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