12 votes

La commande personnalisée ne fonctionne pas

Dans mon XAML, j'ai ceci :

<UserControl.CommandBindings>
    <CommandBinding Command="Help"
   CanExecute="HelpCanExecute"
   Executed="HelpExecuted" />
</UserControl.CommandBindings>

<MenuItem Header="Help" Command="Help" />

Cela fonctionne bien. Lorsque je clique sur le menu contextuel, HelpExecuted() est appelé.

Je veux maintenant refaire la même chose, mais en utilisant une commande personnalisée au lieu de la commande d'aide. Voici donc ce que je fais :

public RoutedCommand MyCustomCommand = new RoutedCommand();

et changer mon XAML en :

<UserControl.CommandBindings>
    <CommandBinding Command="MyCustomCommand"
   CanExecute="HelpCanExecute"
   Executed="HelpExecuted" />
</UserControl.CommandBindings>

<MenuItem Header="Help" Command="MyCustomCommand" />

Mais je reçois l'erreur : Impossible de convertir la chaîne "MyCustomCommand" dans l'attribut "Command" en objet de type "System.Windows.Input.ICommand". CommandConverter ne peut pas convertir de System.String.

Qu'est-ce qui m'échappe ? Et veuillez noter que je veux faire tout cela en XAML, c'est-à-dire que je ne veux pas utiliser CommandBindings.Add(new CommandBinding(MyCustomCommand....

15voto

René Points 4134

Oups, désolé, j'ai été un peu rapide pour poster ma réponse initiale. Je vois maintenant que le problème ne vient pas du type mais du CommandBinding. Vous devez utiliser une extension de balisage pour résoudre le nom de la commande. J'ai l'habitude de rendre mes commandes statiques dans leur déclaration comme ceci :

namespace MyApp.Commands
{
    public class MyApplicationCommands
    {
        public static RoutedUICommand MyCustomCommand 
                               = new RoutedUICommand("My custom command", 
                                                     "MyCustomCommand", 
                                                     typeof(MyApplicationCommands));
    }
}

Et dans le XAML :

<UserControl x:Class="..."
             ...
             xmlns:commands="clr-namespace:MyApp.Commands">
...
<UserControl.CommandBindings>
    <CommandBinding Command="{x:Static commands:MyApplicationCommands.MyCustomCommand}"
    CanExecute="HelpCanExecute"
    Executed="HelpExecuted" />
</UserControl.CommandBindings>

Vous devez introduire l'espace de noms de la classe qui la contient en utilisant xmlns. Je l'ai appelé "commands" dans mon exemple ci-dessus.

L'article original se trouve ci-dessous :

Essayez de changer le type de la commande en RoutedUICommand. Le constructeur est un peu différent :

public RoutedUICommand MyCustomCommand 
             = new RoutedUICommand("Description", "Name", typeof(ContainingClass));

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X