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 :

[WPF] Utilisation des commandes.


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de ThitoO
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 134
    Par défaut [WPF] Utilisation des commandes.
    Bonjour à tous,

    J'ai un petit problème de commandes en WPF ...
    En gros j'ai une interface simple, avec une ListBox bindée sur une collection, ainsi qu'un bouton qui permet de supprimer l'élement selectionné dans la ListBox.

    Pour cela voici mon XAML :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <Button Grid.Column="1" Content="Supprimer" Grid.Row="0" Margin="10"  CommandParameter="{Binding ElementName=Lb, Path=SelectedItem}" Command="{Binding Path=DeleteCmd}"/>
    <ListBox Margin="10" ItemsSource="{Binding Path=Users}" Grid.Row="1" Grid.ColumnSpan="2" x:Name="Lb"/>
    Voici le code ma classe DeleteCmd implémentant ICommand :
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    internal class DeleteCmd : ICommand
        {
            ICollection<User> _users;
            bool _canExec;
     
            public DeleteCmd( ICollection<User> users )
            {
                _users = users;
            }
     
            public bool CanExecute( object parameter )
            {
                bool canExec;
                if( parameter != null )
                {
                    if( parameter is User )
                    {
                        canExec = true;
                    }
                }
                canExec = false;
     
                if( canExec != _canExec )
                {
                    _canExec = canExec;
                    if( CanExecuteChanged != null ) CanExecuteChanged( this, EventArgs.Empty );
                }
                return _canExec;
            }
     
            public event EventHandler  CanExecuteChanged;
     
            public void Execute( object parameter )
            {
                _users.Remove( (User)parameter );
            }
        }
    Donc voila, normalement cela devrai fonctionner, mais le problème est simple : lors du chargement de la page la méthode CanExecute de ma propriété DeleteCmd (de type ICommand) est appellée, or le paramètre est null (car aucun élement n'est selectionné dans la ListBox), et donc la méthode CanExecute retourne null. Et donc le bouton "Supprimer" est désactivé.

    Comment puis-je faire en sorte de réactiver le bouton ? Et plus généralement, comment faire en sorte que le mécanisme des commandes soit au courant des changements dans la fenetre pour qu'il puisse réevaluer la méthode CanExecute (pour réactiver des composants précédemment désactivés) ?

    Merci de votre aide
    Antoine.

  2. #2
    Membre confirmé Avatar de ThitoO
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 134
    Par défaut
    Re-Bonjour,

    j'ai trouvé pourquoi la méthode CanExecute n'est pas rappellée ensuite car c'est à la classe implémentant ICommand d'implementer son propre systeme de refresh.
    Pour utiliser les commandes plus simplement, sans devoir créer une classe à chaque fois, il faut utiliser les RoutedCommands qui elles implémentent leur propre systeme de refresh.

    http://msdn.microsoft.com/en-us/libr...edcommand.aspx


  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 : 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
    Plusieurs choses:
    -il me semble qu'il n'est pas possible de faire du binding dans un commandparameter en 3.5
    -si tu ne veux pas te prendre la tête avec quand rafraichir le CanExecute tu peux essayer ceci:

    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
    internal class DeleteCmd : ICommand
        {
            ICollection<User> _users;
            bool _canExec;
     
            public DeleteCmd( ICollection<User> users )
            {
                _users = users;
            }
     
            public bool CanExecute( object parameter )
            {
                return parameter !=null && parameter is user;
            }
     
            public event EventHandler  CanExecuteChanged
            {
                    add { CommandManager.RequerySuggested += value; }
                    delete { CommandManager.RequerySuggested -= value; }
             }
     
            public void Execute( object parameter )
            {
                _users.Remove( (User)parameter );
            }
        }
    http://joshsmithonwpf.wordpress.com/...mmand-objects/

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

Discussions similaires

  1. utilisation des commandes "." et "exec"
    Par khaliloum dans le forum Linux
    Réponses: 2
    Dernier message: 13/01/2007, 09h08
  2. Réponses: 2
    Dernier message: 16/12/2006, 17h37
  3. Erreur utilisation des commandes shell
    Par paolo2002 dans le forum Windows XP
    Réponses: 7
    Dernier message: 05/11/2006, 14h09
  4. utilisation des commandes shell dans un programme C
    Par rasgueados dans le forum Linux
    Réponses: 15
    Dernier message: 03/08/2006, 17h25
  5. Utiliser des commandes MS-DOS en langage C ?
    Par Spidermeu dans le forum C
    Réponses: 33
    Dernier message: 22/02/2006, 13h10

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