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 :

RelayCommand et méthode avec paramètres


Sujet :

Silverlight

  1. #1
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Septembre 2007
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2007
    Messages : 173
    Par défaut RelayCommand et méthode avec paramètres
    Bonjour à tous,

    Je souhaite appeler une méthode en utilisant une propriété de type RelayCommand.

    Cela fonctionne parfaitement quand je n'ai pas de paramètre dans la signature de la méthode.

    Voici ce que j'ai tenté
    Code : 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
     
            private RelayCommand addDefaultCmd;
     
            public RelayCommand AddDefaultCmd
            {
                get
                {
                    if (addDefaultCmd == null)
                    {
                        addDefaultCmd = new RelayCommand(AddDefault);
                    }
                    return addDefaultCmd;
                }
                //set { addDefaultCmd = value; }
            }
     
            private void AddDefault(object sender, MouseButtonEventArgs e)
            {
                Shape root = (Polygon)e.OriginalSource;
     
                this.listDefault.Add(new Default()
                {
                    X = e.GetPosition(relativeTo: (Polygon)e.OriginalSource).X,
                    Y = e.GetPosition(relativeTo: (Polygon)e.OriginalSource).Y
                });
             }
    Merci par avance de votre aide.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut,

    MVVM Light Toolkit possède un behavior EventToCommand permettant de passer l'argument de l'évènement en paramètre en mettant à true la valeur de la propriété PassEventArgsToCommand au cas où t'utiliserais ce framework

  3. #3
    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
    Par défaut
    Plus simplement, MVVM Light Toolkit possède une variante de la classe RelayCommand qui prend/accepte un paramètre.

  4. #4
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Septembre 2007
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2007
    Messages : 173
    Par défaut
    Les façons de faire m'interresse!
    Auriez-vous des exemples?

  5. #5
    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
    Par défaut
    Un exmple simple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    RelayCommand<string> MyCommand = new RelayCommand<string>(s =>
    {
        MessageBox.Show(s);
    });
    Il te suffit maintenant d'affecter une string à la propriété CommandParameter du contrôle qui utilise ta Command (ou à l'EventToCommand)

  6. #6
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Septembre 2007
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2007
    Messages : 173
    Par défaut
    Merci pour ton aide précieuse!

    Est-il possible de mettre dans le CommandParameter le sender et MouseButtonEventArgs?

    Pour cette méthode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    private void AddDefault(object sender, MouseButtonEventArgs e)
    {
          this.listDefault.Add(new Default()
          {
                X = e.GetPosition(relativeTo: (Polygon)e.OriginalSource).X,
                Y = e.GetPosition(relativeTo: (Polygon)e.OriginalSource).Y
          });
    }

  7. #7
    Membre émérite
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Par défaut
    Helo,

    Pour moi le viewmodel doit "préparer" les données pour l'affichage, mais ça me semble bizarre qu'il s'occupe de savoir quel control graphique lui envoie des évènements.
    Je trouve ça déjà assez limite de lui passer des arguments de l'évènement...

    Je pense que tous les scénarii ne sont pas éligibles au MVVM. Ceci en est peut être un cas.
    J'ai moi même pleins de cas où le MVVM me pose plus de problèmes qu'il n'en résout.

    C'est juste une opinion, je n'ai sans doute pas compris précisément ce que tu essaies de faire.

    A+
    Christophe

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par nasimpat7 Voir le message
    Merci pour ton aide précieuse!

    Est-il possible de mettre dans le CommandParameter le sender et MouseButtonEventArgs?
    Avec MVVM Light Toolkit, cela est possible .

    Le fait que la vue passe des paramètres d'un évènement qui ne sont autre que des données au ViewModel qu'elle utilise cela ne casse en rien le pattern MVVM. C'est comme si on disait qu'on ne devrait pas passer la valeur d'un TextBox au ViewModel par exemple.

  9. #9
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Septembre 2007
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2007
    Messages : 173
    Par défaut
    Merci pour vos lumières!

    Pour passer le gestionnaire d'événement associé au control, j'ai utilisé la propriété PassEventArgsToCommand="True"

    de cette façon (exemple sur un button):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <Button DataContext="{Binding Source={StaticResource LocatorVM}, Path=Wm1 }" Content="Add default">
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="Click">
                            <cmd:EventToCommand PassEventArgsToCommand="True" Command="{Binding AddDefaultCmd}" />
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                </Button>
    Effectivement comme l'a conseillé Thomas Lebrun, j'ai fais comme cela pour ma command:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    private RelayCommand<RoutedEventArgs> addDefaultCmd;
     
            public RelayCommand<RoutedEventArgs> AddDefaultCmd
            {
                get
                {
                    if (addDefaultCmd == null)
                    {
                        addDefaultCmd = new RelayCommand<RoutedEventArgs>((e) => AddDefault(e));
                    }
                    return addDefaultCmd;
                }
                //set { addDefaultCmd = value; }
            }
    Voici ma méthode exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private void AddDefault(RoutedEventArgs e)
    {
              MessageBox.Show(e.OriginalSource.ToString());
    }
    Ca fonctionne parfaitement!
    Merci à vous

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 22/07/2008, 17h26
  2. Réponses: 0
    Dernier message: 22/07/2008, 11h28
  3. Réponses: 1
    Dernier message: 28/01/2008, 14h49
  4. appeler une méthode avec paramètre dans une page JSP
    Par javasmif dans le forum Struts 2
    Réponses: 1
    Dernier message: 06/12/2007, 10h48
  5. méthode avec paramètre
    Par MaitrePylos dans le forum Ruby on Rails
    Réponses: 9
    Dernier message: 21/06/2007, 09h26

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