38 votes

Liaison d'une clé de raccourci WPF à une commande dans le ViewModel

J'ai une application WPF qui utilise le pattern MVVM. Raccordement de boutons à la VM est assez simple puisqu'ils mettent en œuvre les ICommand. J'ai un menu contextuel qui fonctionne de manière similaire. La prochaine étape est de créer des touches de raccourci pour le menu contextuel. Je ne peux pas comprendre comment obtenir la clé de raccourci invoquer la Commande. Voici un exemple:

<MenuItem Header="Update" Command="{Binding btnUpdate}" >
    <MenuItem.Icon>
        <Image Source="/Images/Update.png"
               Width="16"
               Height="16" />
        </MenuItem.Icon>
    </MenuItem>

maintenant, j'ai ajouté ceci:

<Window.InputBindings>
    <KeyBinding Key="U"
                Modifiers="Control" 
                Command="{Binding btnUpdate}" />
</Window.InputBindings>

à essayer de se connecter les touches de raccourci pour la même liaison, mais cela ne fonctionne pas. L'erreur est:

Erreur 169 'Liaison' ne peut pas être réglé sur "Commande" de la propriété de type 'Raccourci'. Un "Liant" ne peut être réglé que sur une DependencyProperty de DependencyObject.

N'est-ce pas là une façon de connecter cet événement pour la Commande? Je ne peux pas comprendre cela.

merci à l'avance!

Le projet de loi

39voto

Michel Keijzers Points 4831

Le code suivant peut être utilisé pour lier une touche de raccourci directement à une commande:

 <Window.InputBindings>
    <KeyBinding Command="{Binding Path=NameOfYourCommand}" 
                Key="O" 
                Modifiers="Control"/>
</Window.InputBindings>
 

Ajoutez ceci après Window.Resources dans le code XAML de votre vue.

27voto

Thomas Levesque Points 141081

J'ai écrit un personnalisé extension de balisage pour "lier" InputBindings de commandes, qui peut être utilisé presque comme une vraie reliure :

<UserControl.InputBindings>
    <KeyBinding Modifiers="Control" 
                Key="E" 
                Command="{input:CommandBinding EditCommand}"/>
</UserControl.InputBindings>

Notez que cette extension de balisage utilise la réflexion, de sorte qu'il ne peut être utilisé que si votre application s'exécute en pleine confiance...

Une autre option est d'utiliser l' CommandReference classe. Il peut être trouvé dans le toolkit MVVM disponible ici. C'est probablement un nettoyant approche, mais un peu plus complexe à utiliser.

Notez que dans WPF 4, l' InputBinding.Command, InputBinding.CommandParameter et InputBinding.CommandTarget des propriétés sont des propriétés de dépendance, de sorte qu'ils peuvent être liés normalement

8voto

Eddie Deyo Points 2416

Je suis d'accord que le faire en XAML est idéal, mais pour des raisons d'exhaustivité, vous pouvez également ajouter votre liaison dans le code. Si vous le faites dans le constructeur, assurez-vous juste que c'est après l'appel à InitializeComponent()

 InputBindings.Add(new Keybinding(btnUpdate, new KeyGesture(Key.U, ModifierKeys.Control));
 

-1voto

jbe Points 4629

Une approche alternative pour lier une clé de raccourci WPF à une propriété Command du ViewModel est présentée dans l'exemple ShortcutKey du projet WPF Application Framework (WAF) .

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