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 - Binding Command / Event


Sujet :

Windows Presentation Foundation

  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 23
    Par défaut MVVM - Binding Command / Event
    Bonjour,

    J'me suis essayé récemment au MVVM (Donc je n'en maitrise pas encore tous les aspects, loin de là) et j'ai rencontré un problème.
    Je voulais binder une commande à une ListBox, pour qu'elle s'active lors d'un double clique.
    Donc après quelques recherches google, j'ai trouvé un tutoriel.

    J'ai appliqué la méthode et elle fonctionne très bien lorsque je l'applique à un élément. Le problème c'est que pour une raison que j'ignore, ca échoue pour ma ListBox (J'obtiens une NullReferenceException). Voici le code de ma ListBox :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <ListBox ItemsSource="{Binding ListLiens}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <TextBlock Text="{Binding Text}" Margin="0" FontSize="13" FontFamily="Trebuchet MS" FontWeight="Bold" Behaviors:EventBehavior.Command="{Binding TestCommand}" Behaviors:EventBehavior.EventName="MouseDown" />
                </Grid>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

    Et voici la partie qui génère l'exception :

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    public void OnEventRaised(TSender sender, TEventargs e)
    {
        var element = sender as UIElement;
        System.Diagnostics.Debug.WriteLine(e.ToString());
        if (element != null)
        {
            var command = (ICommand)element.GetValue(EventBehavior.CommandProperty);
            command.Execute(e); /* !!ICI!! */
        }
        else
        {
            throw new NullReferenceException("This behavior can only be installed on UIElement objects !");
        }
    }

    Je ne comprends pas vraiment pourquoi cela ne génère une erreur que lorsque le TextBlock se trouve dans la ListBox, je n'ai aucun problème si je l'en sors.
    J'ai testé de placé l'évènement directement dans la balise de la ListBox, sans résultat.

    J'ai aussi un autre problème, c'est que dans le cas du TextBlock, il n'existe pas d'évènement double click, jusqu'ici j'utilisais une condition pour vérifier la valeur du e.Count dans l'évènement, mais là ce n'est pas possible.

    Voilà, merci d'avance pour votre aide.

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    1 377
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 377
    Par défaut
    le problème est probablement ici :

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    var element = sender as UIElement;

    Le sender n'est probablement pas un UIElement dans ton cas, si tu debug tu devrais facilement vérifier si ton sender devient null seulement après cette ligne
    Échouer, c'est avoir la possibilité de recommencer de manière plus intelligente.

    Twitter Blog Mon site

    Mon article sur l'agilité

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 23
    Par défaut
    Sur le coup je m'étais posé la même question.
    Seulement là, ce qui est null c'est e, pas element.
    Si element était null, il ne serait pas rentré dans la condition et aurait directement renvoyé cette exception :
    throw new NullReferenceException("This behavior can only be installed on UIElement objects !");

    Ce qu'il ne fait pas ici.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Pourquoi ne pas passer par le MVVM light toolkit qui intégre déjà un ensemble de classes te permettant du MVVM facilement et en l'occurence gérer les évènements dans la vue-modèle et y passer les arguments des évènements.

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 23
    Par défaut
    Ah, j'en ai entendu parlé en faisant quelques recherches.
    J'vais me renseigner un peu plus sur la question.

    Sinon, j'ai trouvé d'ou venait le problème :
    J'avais bindé une ObservableCollection à ma ListBox, du coup il ne trouvait plus ma commande.
    J'ai réussi à contourner ce problème.

    Par contre je ne vois toujours pas comment faire pour lui faire faire un double click et non un simple MouseDown.

    Peut être que le MVVM light toolkit me le permettra plus facilement.
    En attendant, si quelqu'un a une idée.

    Edit:
    Bon, j'ai fini par trouver une solution.
    Pour ceux qui aurait le même problème, voici en gros comment je m'y suis pris :
    J'ai Ajouté une propriété attaché que j'ai appelé EventType (En plus de EventName et Command donc).
    Ensuite j'ai ajouté une condition pour vérifier le contenu de EvenType dans la méthode OnEventRaised, comme ceci :
    Code c# : 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
     
    public void OnEventRaised(TSender sender, TEventargs e)
    {
        var element = sender as UIElement;
        string type = (string)element.GetValue(EventBehavior.EventTypeProperty);
        if (type == "Double")
        {
            MouseButtonEventArgs eventArgs = e as MouseButtonEventArgs;
            if (eventArgs.ClickCount == 2)
            {
                if (element != null)
                {
                    var command = (ICommand)element.GetValue(EventBehavior.CommandProperty);
                    command.Execute(e);
                }
                else
                {
                    throw new NullReferenceException("This behavior can only be installed on UIElement objects !");
                }
            }
        }
        else
        {
            if (element != null)
            {
                var command = (ICommand)element.GetValue(EventBehavior.CommandProperty);
                command.Execute(e);
            }
            else
            {
                throw new NullReferenceException("This behavior can only be installed on UIElement objects !");
            }
        }
    }

    Et ça fonctionne très bien

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

Discussions similaires

  1. [MVVM][.net3.5] InputBinding, Binding Command et CommandParameter
    Par Monkey56 dans le forum Windows Presentation Foundation
    Réponses: 10
    Dernier message: 21/06/2011, 18h09
  2. MVVM Bind Command on Ribbon Button
    Par redkan dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 17/11/2010, 16h30
  3. [MVVM] Les commandes de la souris
    Par Robin56 dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 01/07/2009, 15h15
  4. [MVVM] Plusieurs Commands pour un seul element
    Par Krustig dans le forum Windows Presentation Foundation
    Réponses: 8
    Dernier message: 22/05/2009, 19h35
  5. C'est quoi cte commande : event.Skip();
    Par firejocker dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 01/10/2005, 14h34

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