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 :

[Débutant] Naviguer d'un usercontrol à un autre [MVVM]


Sujet :

Windows Presentation Foundation

  1. #1
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 696
    Points : 2 443
    Points
    2 443
    Par défaut [Débutant] Naviguer d'un usercontrol à un autre
    Bonjour.

    Je débute avec l'utilisation du framework WPF + MVVM light.

    Je cherche à faire une application qui où on peut naviguer entre plusieurs fenêtres.

    Actuellement j'ai l'architecture suivante, largement inspirée de plusieurs posts sur le Net :


    Code App.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
    <Application x:Class="ManageUsers.App"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:v="clr-namespace:ManageUsers.View"
                 xmlns:vm="clr-namespace:ManageUsers.ViewModel"
                 StartupUri="MainWindow.xaml">
     
        <Application.Resources>
            <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
            <DataTemplate DataType="{x:Type vm:ListViewModel}">
                <v:ListView />
            </DataTemplate>
            <DataTemplate DataType="{x:Type vm:EditViewModel}">
                <v:EditView />
            </DataTemplate>
        </Application.Resources>
     
    </Application>

    Code MainWindow.xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <Window x:Class="ManageUsers.MainWindow" DataContext="{Binding Main, Source={StaticResource Locator}}">
     
        <DockPanel>
            <ContentControl Content="{Binding CurrentViewModel}" />
        </DockPanel>
    </Window>

    Code MainWindowViewModel.cs : 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    using GalaSoft.MvvmLight;
    using GalaSoft.MvvmLight.Command;
    using ManageUsers.Model;
    using System.Windows.Input;
     
    namespace ManageUsers.ViewModel {
        public class MainViewModel : ViewModelBase {    
            public MainViewModel() {
                CurrentViewModel = MainViewModel._firstViewModel;
                GotoEdit = new RelayCommand(() => CurrentViewModel = _firstViewModel);
                GotoList = new RelayCommand(() => CurrentViewModel = _secondViewModel);
            }
     
            private ViewModelBase _currentViewModel;
     
            readonly static ListViewModel _firstViewModel = new ListViewModel();
            readonly static EditViewModel _secondViewModel = new EditViewModel();
     
            public ViewModelBase CurrentViewModel {
                get {
                    return _currentViewModel;
                }
                set {
                    if (_currentViewModel == value)
                        return;
                    _currentViewModel = value;
                    RaisePropertyChanged("CurrentViewModel");
                }
            }
     
            public ICommand GotoEdit { get; private set; }
            public ICommand GotoList { get; private set; }
     
        }
    }


    Dans tous les exemples en ligne que j'ai consulté, le bouton pour changer de vue est au niveau du MainWindow, à côté de <ContentControl />.
    Mais comment changer de vue si le bouton est au niveau du UserControl ? Comment remonter la commande de ListView à MainViewModel ?

    Merci.
    Je fais appel aux esprits de Ritchie, Kernighan, Stroustrup et Alexandrescu
    Donnez moi la force, donnez moi le courage de coder proprement !

    « Ça marche pas » n'est PAS une réponse convenable, merci de détailler le souci en fournissant l’environnement, le code source, les commandes et les messages d'erreur.

    Ce club possède également un clavardage, on y trouve quelques perles entre deux sessions d'entraides.

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 025
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 025
    Points : 5 462
    Points
    5 462
    Par défaut
    Je comprends pas le soucis, avec le code que tu as tu binds juste la commande de tes boutons à tes RelayCommand et ca devrait fonctionner.
    Ou alors justement tu veux savoir comment faire pour mettre les boutons à l’intérieur d'une "vue" un peu ou tu en as envie, ou même pouvoir naviguer sans boutons (traitement issue d'une logique quelconque).
    Dans ce cas là si tu veux garder un couplage faible stricte il faut passer par une messagerie, Messenger pour mvvm light.
    Ton Main est abonné à 2 types de messages différent, et lorsqu'il en reçoit un va simplement modifier le CurrentViewModel comme le font tes RelayCommand.

    Tu peux également faire une entorse au couplage strict et considérer que ton Main va pas changer tout les 4 matins et exposer des commandes statics ou avoir une reference de ton main dans chacune des autres viewmodels. Je suis pas trop fan, mais le systeme de messagerie peut vite devenir compliqué à maintenir!

  3. #3
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 696
    Points : 2 443
    Points
    2 443
    Par défaut
    Hello.

    C'est ça le soucis, la vue n'a accès qu'aux RelayCommands de sa vue-modèle (ListViewModel.cs) qui elle n'a pas n'a pas accès à la vue-modèle principale (MainWindowViewModel.cs), à moins de jongler avec les DataTemplate / Binding que je ne maitrise absolument pas.

    L'histoire des Messages me plait bien, je vais regarder de ce côté là.

    Merci.
    Je fais appel aux esprits de Ritchie, Kernighan, Stroustrup et Alexandrescu
    Donnez moi la force, donnez moi le courage de coder proprement !

    « Ça marche pas » n'est PAS une réponse convenable, merci de détailler le souci en fournissant l’environnement, le code source, les commandes et les messages d'erreur.

    Ce club possède également un clavardage, on y trouve quelques perles entre deux sessions d'entraides.

  4. #4
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 696
    Points : 2 443
    Points
    2 443
    Par défaut
    J'ai pu me dépatouiller grâce aux messages et faire ce que je voulais.

    Du coup j'ai un fonction qui Register les messages dans le MainViewModel, et le message est envoyé lors de l'appui du bouton.

    Merci pour le tuyau
    Je fais appel aux esprits de Ritchie, Kernighan, Stroustrup et Alexandrescu
    Donnez moi la force, donnez moi le courage de coder proprement !

    « Ça marche pas » n'est PAS une réponse convenable, merci de détailler le souci en fournissant l’environnement, le code source, les commandes et les messages d'erreur.

    Ce club possède également un clavardage, on y trouve quelques perles entre deux sessions d'entraides.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 06/04/2007, 16h33
  2. [Débutant] SYSDBA SYSOPER SYS, et les autres..
    Par kimlee dans le forum Administration
    Réponses: 1
    Dernier message: 25/10/2006, 15h00
  3. [Débutant] Changer une valeur dans une autre base
    Par Cyphen dans le forum Access
    Réponses: 5
    Dernier message: 18/08/2006, 15h26
  4. [Débutant(e)] JSP utilisation static....une autre
    Par tcgenrecom dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 01/03/2004, 15h27

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