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

Silverlight Discussion :

[MVVM Light] Relayer un click au ViewModel via Locator


Sujet :

Silverlight

  1. #1
    Expert confirmé
    Avatar de Nicolas Esprit
    Homme Profil pro
    Consultant en technologies
    Inscrit en
    Février 2010
    Messages
    1 467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en technologies
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 1 467
    Points : 4 066
    Points
    4 066
    Par défaut [MVVM Light] Relayer un click au ViewModel via Locator
    Bonjour à tous,

    Je me mets petit à petit à Silverlight et MVVM et j'ai besoin de vos lumières.

    Je développe une petite application WP7 et rencontre une difficulté à utiliser MVVM Light et le pattern Service Locator. Cette difficulté est plus inhérente à MVVM qu'à WP7.

    J'ai une ApplicationBar dans une Page :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <phone:PhoneApplicationPage 
        ...
        DataContext="{Binding PivotPage, Source={StaticResource Locator}}">
    
    <Grid>...</Grid>
    
    <phone:PhoneApplicationPage.ApplicationBar>
       <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True">
         <shell:ApplicationBarIconButton x:Name="appbar1" IconUri="..." Text="1" 
         Click="ApplicationBarMenuItemClick" />
       </shell:ApplicationBar>
    </phone:PhoneApplicationPage.ApplicationBar>
    Le contrôle ApplicationBarIconButton n'a pas de propriété Command. Je ne peux donc Binder la commande de mon ViewModel. Il faut donc utiliser l'évènement Click (cf le billet de Laurent Bugnion à ce sujet), comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    private void ApplicationBarMenuItemClick(object sender, System.EventArgs e)
    {
        var vm = DataContext as PivotViewModel;
        if (vm != null)
        {
            vm.MyCommand.Execute(null);
        }
    }
    Jusque là pas de problème. Là où ça se complique c'est dans l'utilisation du pattern Service Locator : ma View ne connait pas et ne doit pas connaître le ViewModel attaché. La solution de facilité reviendrait à coupler la View au ViewModel, mais ça n'est pas propre.

    Avez-vous une astuce ? Peut-être en utilisant le Messenger de MVVM Light Toolkit ?

    Merci d'avance.

  2. #2
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par Nicolas Esprit Voir le message
    ma View ne connait pas et ne doit pas connaître le ViewModel attaché.
    Faux: ta vue connait son ViewModel, de part son DataContext.

    Et dans ton cas, je ne vois pas où est le pb, même avec le Service Locator:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    private void ApplicationBarMenuItemClick(object sender, System.EventArgs e)
    {
        var vm = ServiceLocator.Current.GetInstance<PivotViewModel>();
        if (vm != null)
        {
            vm.MyCommand.Execute(null);
        }
    }

  3. #3
    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 : 38
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 082
    Points
    8 082
    Par défaut
    Citation Envoyé par Thomas Lebrun Voir le message
    Faux: ta vue connait son ViewModel, de part son DataContext.

    Et dans ton cas, je ne vois pas où est le pb, même avec le Service Locator:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    private void ApplicationBarMenuItemClick(object sender, System.EventArgs e)
    {
        var vm = ServiceLocator.Current.GetInstance<PivotViewModel>();
        if (vm != null)
        {
            vm.MyCommand.Execute(null);
        }
    }
    Si tu veux découpler tu peux dire que ta vue connait le ViewModel via une interface du ViewModel

  4. #4
    Expert confirmé
    Avatar de Nicolas Esprit
    Homme Profil pro
    Consultant en technologies
    Inscrit en
    Février 2010
    Messages
    1 467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en technologies
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 1 467
    Points : 4 066
    Points
    4 066
    Par défaut
    Citation Envoyé par Thomas Lebrun Voir le message
    Faux: ta vue connait son ViewModel, de part son DataContext.
    Oui, accorde-moi quand même le mérite d'avoir compris ça .

    Disons que :

    1. Je me suis mal exprimé
    2. J'ai lu trop vite les cours sur MVVM et il y a confusion

    Pour la confusion : MVVM Light propose d’ajouter une inversion de contrôle pour renforcer l’isolation entre View et ViewModel. Pour cela on peut utiliser le Service Locator ou faire de l'injection de dépendance. Le but recherché est donc d'éviter que le DataContext de la View ne pointe directement sur l’instance du ViewModel. Or moi, en lisant trop vite (ça m'apprendra à bosser tard le soir alors que je suis crevé), je me suis compliqué la vie en retenant qu'il fallait aussi éviter le couplage View/ViewModel ( dans le sens "à une View on pourrait associer des ViewModels différents mais respectant le même template, ou plutôt la même interface").

    Donc l'exemple que tu as fourni j'y avais pensé, mais vu ma confusion, je pensais que je ne devais pas avoir de référence en dur à la classe PivotViewModel. C'est là que je me suis mal exprimé en disant "ma View ne connait pas et ne doit pas connaître le ViewModel attaché". J'aurais du dire "dans le code-behind de ma View je ne dois pas connaître la classe ViewModel attachée, seul le lien DataContext via Locator est connu".

    Bref, je me suis emmélé les pinceaux et compliqué la vie pour rien.

    Merci de m'avoir fait réfléchir

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

Discussions similaires

  1. [Débutant] [MVVM Light] Transmettre un objet à un ViewModel.
    Par metalsephiroth dans le forum C#
    Réponses: 0
    Dernier message: 11/12/2012, 16h03
  2. Réponses: 15
    Dernier message: 23/08/2011, 14h26
  3. [SL4]MVVM Light toolkit + Messenger
    Par chris81 dans le forum Silverlight
    Réponses: 2
    Dernier message: 20/07/2010, 09h04
  4. DataForm Template MVVM light
    Par pmorestin dans le forum Silverlight
    Réponses: 3
    Dernier message: 21/04/2010, 15h03

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