Lier la zone de texte sur la touche Entrée appuyez sur
La valeur par défaut de la liaison de données sur TextBox
est TwoWay
et il engage le texte à la propriété que lorsque TextBox
perdu son accent.
Est-il facile XAML façon de faire de la liaison de données qui se passe quand je appuyez sur la touche Entrée du TextBox
?. Je sais que c'est assez facile à faire dans le code derrière, mais imaginez si ce TextBox
est à l'intérieur de certains complexes DataTemplate
.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez vous faire un pur XAML approche par la création d'un attaché comportement.
Quelque chose comme ceci:
Puis dans votre XAML, vous définissez la
InputBindingsManager.UpdatePropertySourceWhenEnterPressedProperty
bien à celui que vous voulez lors de la mise à jour de l' Entrée touche est enfoncée. Comme ce(Vous avez juste besoin de assurez-vous d'inclure un xmlns clr-namespace de référence pour le "b" dans l'élément racine de votre fichier XAML de pointage pour qui jamais de noms, vous mettez le InputBindingsManager dans).
UpdatePropertySourceWhenEnterPressed
changements à partir d'une valeur valide pour une valeur valide différente, vous désabonner & re-souscrire à laPreviewKeyDown
événement inutilement. Au lieu de cela, tous vous avez besoin est de vérifier si oui ou non lee.NewValue
estnull
ou pas. Si pasnull
, puis abonnez-vous; si, au contraire,null
, puis se désinscrire.binding.UpdateSource()
efface les erreurs de validation. J'avais besoin de vérifier d'abord si la mise à jour devrait se produire en regardantBindingExpression.HasError
.Je ne crois pas qu'il y a un "pur XAML" façon de faire ce que vous décrivez. Vous pouvez configurer une liaison de sorte qu'il met à jour à chaque fois que le texte dans une zone de texte changements (plutôt que lorsque la zone de texte perd le focus) par la mise en au UpdateSourceTrigger propriété, comme ceci:
Si vous définissez UpdateSourceTrigger à "Explicite" et ensuite géré la zone de texte du PreviewKeyDown événement (la recherche de la touche Entrée) ensuite, vous pouvez réaliser ce que vous voulez, mais il faudrait des code-behind. Peut-être une sorte de propriété attachée (semblable à mon EnterKeyTraversal propriété) woudld travail pour vous.
C'est comment j'ai résolu ce problème. J'ai créé un gestionnaire d'événements qui allaient dans le code behind:
Alors je viens d'ajouter ce que un événement KeyUp gestionnaire dans le code XAML:
Le gestionnaire d'événement utilise son
sender
de référence à cause de sa propre liaison de mise à jour. Depuis le gestionnaire d'événements est autonome alors, il faut travailler dans un complexe DataTemplate. Ce un gestionnaire d'événement peut maintenant être ajouté à toutes les zones de texte qui ont besoin de cette fonctionnalité.KeyBinding
dans le code XAML de feu de cette méthode car mon INTERFACE a un "Défaut" de contrôle qui attrape la touche entrée. Vous avez besoin de l'attraper à l'intérieur de cette zone de texte pour arrêter la il se propageant à l'INTERFACE utilisateur d'arbre en arbre "par Défaut" de contrôle.tBox.GetBindingExpression(props)
parce que, pour une raison quelconque ils ont quitté la méthode statique.Vous pouvez facilement créer votre propre contrôle héritant de la zone de texte et de le réutiliser tout au long de votre projet.
Quelque chose de similaire à ceci devrait fonctionner:
Il y a peut être un moyen de contourner cette étape, mais sinon, vous devez lier comme ceci (à l'aide Explicite):
Si vous combinez les deux et Ben ausadmin solutions, vous vous retrouvez avec un très MVVM solution à l'amiable:
...ce qui signifie que vous êtes de passage le
TextBox
lui-même en tant que paramètre à laCommand
.Cela conduit à votre
Command
qui ressemble à ceci (si vous utilisez unDelegateCommand
-mise en œuvre de style dans votre VM):Ce
Command
mise en œuvre peut être utilisé pour toutTextBox
et le meilleur de tous, pas de code dans le code-behind bien que vous voudrez peut-être mettre cela dans sa propre classe, donc il n'y a pas de dépendances surSystem.Windows.Controls
dans votre VM. Il dépend de la rigueur de votre code de lignes directrices.Ici est une approche qui me semble assez simple, et plus facile que l'ajout d'un AttachedBehaviour (qui est également une solution valable). Nous utilisons la valeur par défaut UpdateSourceTrigger (LostFocus zone de texte), puis ajouter un InputBinding de la Touche Entrée, lié à une commande.
Le code xaml est comme suit
Alors la Commande méthodes sont
Et de la zone de texte est lié à la Propriété
Jusqu'à présent cela semble bien fonctionner et les captures de la Touche Entrée de l'événement dans la zone de texte.
De plus simple, il suffit de définir
UpdateSourceTrigger
àPropertyChanged
dans votreTextBox
's liaison sans rien ajouter dans le code-behind.Juste comme ça:
Cela fonctionne pour moi.
Ce n'est pas une réponse à la question initiale, mais plutôt une extension de la accepté de répondre à par @Samuel Jack. Je n'ai la suite dans ma propre application, et a été impressionné par l'élégance de Samuel solution. Il est très propre, et très réutilisables, car il peut être utilisé sur n'importe quel contrôle, pas seulement la
TextBox
. Je pensais que ce doit être partagé avec la communauté.Si vous avez une Fenêtre avec un millier de
TextBoxes
que tous ont besoin pour la mise à jour de la Source de Liaison sur Entrée, vous pouvez joindre ce comportement à tous par y compris le code XAML ci-dessous dans votreWindow
Resources
plutôt que de s'attacher à chaque zone de texte. Vous devez d'abord mettre en œuvre les attachés de comportement comme par Samuel post, bien sûr.Vous pouvez toujours limiter la portée, si nécessaire, de mettre le Style dans les Ressources de l'une de la Fenêtre des éléments d'enfant (c'est à dire un
Grid
) qui contient la cible des zones de texte.Dans le cas où vous utilisez MultiBinding avec votre zone de texte, vous devez utiliser
BindingOperations.GetMultiBindingExpression
méthode au lieu deBindingOperations.GetBindingExpression
.Cela fonctionne pour moi:
Répondu ici assez élégamment à l'aide de comportements attachés, ma méthode de prédilection pour presque rien.
WPF comment faire de la zone de texte perdre le focus après avoir appuyer sur la touche enter
Personnellement, je pense que la présence d'une Extension de Balisage est un nettoyant approche.