C# - Comment gérer XAML Clavier dans MVVM?
Jusqu'à maintenant, je suis en utilisant le .xaml.cs pour gérer les entrées.
Voici mon code xaml de la tête du code :
<Window x:Class="My_Windows_App.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:My_Windows_App.ViewModel"
Title="MainWindow" Height="600" Width="900"
Keyboard.KeyDown="keyDownEventHandler" Keyboard.KeyUp="keyUpEventHandler">
Et voici une partie de la MainWindow.xaml.cs code :
public partial class MainWindow : Window
{
private bool pushToTalk;
public void keyDownEventHandler(object sender, KeyEventArgs e)
{
if (e.Key == Key.LeftCtrl)
pushToTalk = true;
}
public void keyUpEventHandler(object sender, KeyEventArgs e)
{
if (e.Key == Key.LeftCtrl)
pushToTalk = false;
}
}
Comment puis-je implent la même chose dans MVVM ?
Parce que pour ce que je comprends, on ne peut pas se lier à une méthode, seules les propriétés, droit ?
OriginalL'auteur Elfayer | 2013-12-06
Vous devez vous connecter pour publier un commentaire.
Gestion des données est un point de Vue souci, pas un ViewModel préoccupation, pourquoi voulez vous déplacer à la ViewModel?
au lieu de cela, délégué de l'application /de la logique métier à l'ViewModel, tout en gardant le Clavier d'Entrée de la manipulation de l'avis:
Avis comment j'ai déplacé le
PushToTalk
propriété du ViewModel, parce que c'est vraiment une partie de la logique de l'application et non de l'INTERFACE utilisateur, tout en gardant les événements de Clavier au niveau de la Vue. Cela ne veut pas briser MVVM parce que vous n'êtes pas de mélange de l'INTERFACE utilisateur et la logique de l'application, vous êtes simplement en plaçant des choses où ils appartiennent vraiment.Mal. MVVM est de ne pas mettre de la logique de gestion de l'INTERFACE et de ensemble, et non sur insensée des restrictions arbitraires sur ce qui peut être utilisé et ce n'est pas. Ma solution est conforme avec MVVM en ayant la Vue de prendre soin de ses préoccupations tout en gardant la logique métier dans le ViewModel.
Ok, je crois. Mais n'est-ce pas en conflit avec la
Command
modèle? Je ne suis pas un puriste. Mais la séparation de l'Interface utilisateur/Logique peut être réalisé avec d'autres architectures etIl n'en conflit avec
Command
modèle, mais il semble y avoir aucun moyen de mettre une commande dans la Fenêtre elle-même. Aussi loin que je peux dire, @Noctis réponse ne fonctionne pas en raison de l'Interaction.Les déclencheurs peuvent ne pas être bloqué sur la fenêtre. Il ya aussi pas de EventTrigger KeyDown/KeyUp donc pas aller dans cette direction.OriginalL'auteur Federico Berasategui
Semble que vous avez obtenu votre réponse, mais voici une autre solution.
Vous pouvez aborder les événements de clavier avec
i:interaction
etInputBindings
. Quelques exemples à l'aide d'unDatePicker
avec interaction serait:(Notez que vous aurez besoin de la ligne suivante dans la fenêtre de votre définitions pour les
i:Interaction
de travail:)et pour l'entrée de la liaison:
N'hésitez pas à jeter un coup d'oeil à mon autre réponse , elle traite de
i:interaction
etInputBindings
, et en retour des points à un autre article sur la gestion des événements de touche: haut/bas datepicker, et discute le code-behind /mvvm approches.Espère que vous les trouverez utiles.
Bien que cette approche est OK, je ne vois pas comment vous traitez avec
OnKeyUp
ici, afin de faire basculer l'PushToTalk
valeur false à la propriété, que l'OP est en train de faire.OriginalL'auteur Noctis
Les œuvres suivantes pour la manipulation de la touche "Entrer" dans une zone de texte:
OriginalL'auteur SurfingSanta