Comment puis-je annuler une zone de texte du texte de changements causés par une liaison?
J'ai un TextBox
à qui j'ai lié une chaîne de caractères, si j'ai maintenant modifier le texte manuellement, je vais être en mesure d'annuler les modifications via TextBox.Undo()
, si toutefois j'ai changer la chaîne et de la zone de texte, le texte est mis à jour, je ne peux pas annuler les modifications et les TextBox.CanUndo
propriété sera toujours false
.
Je suppose que cela pourrait avoir à faire avec le remplacement complet du texte, plutôt que d'une modification.
Des idées sur comment je peut obtenir que cela fonctionne?
Avez-vous essayé le Mode=TwoWay dans votre chaîne de liaison?
Jamais l'esprit, liaison Bidirectionnelle n'a pas fonctionné...
Jamais l'esprit, liaison Bidirectionnelle n'a pas fonctionné...
OriginalL'auteur H.B. | 2010-12-18
Vous devez vous connecter pour publier un commentaire.
OK, a commencé à laisser un commentaire et réalisé que c'était une réponse 🙂
Zone de texte.Annuler() est destiné à annuler un utilisateur de l'interaction avec la zone de texte, pas un changement de valeur dans la propriété il est lié. Un changement dans la propriété de la zone de texte est lié à la volonté de simplement mettre à jour la valeur de la TextBox, c'est un autre changement qu'un utilisateur de modifier via focus/clavier. Si vous devez Annuler les modifications de propriétés liées, vous avez probablement besoin d'enquêter sur l'ajout d'un Undo/Redo de la pile de votre application.
OriginalL'auteur Ken Henderson
J'ai été confronté au même problème (nécessaire pour accepter l'entrée sur Entrée et pour revenir à la valeur originale sur Escape) et a été en mesure de la traiter de cette façon:
UpdateSourceTrigger
de votreTextBox.Text
de liaison àExplicit
.Poignée
KeyDown
événement de votre zone de texte et placez le code suivant dedans:J'ai trouvé cette solution pour être très élégant car il peut être utilisé dans les DataTemplates trop. Par exemple dans mon cas je l'ai utilisé pour permettre l'édition de la ListBox éléments.
OriginalL'auteur dotNET
Attribuer directement à la zone de texte:
newText
, j'étais en train de restaurer une vieille valeur qui aurait dû être stockés dans la zone de texte de l'histoire.Cela fonctionne très bien! Ne pas remplacer le presse-papiers, et vous permet d'annuler les missions texte qui n'ont pas été faites par l'utilisateur! Merci Pixar! H. B. je considère enrichissante Pixar avec la réponse, puisque c'est exactement ce que vous avez demandé dans la question.
Non, malheureusement, la question est à propos du texte de changements causés par les liaisons, à savoir le bien que l'
TextBox.Text
est lié à est changé, pas d'interaction avec leTextBox
lui-même.Ceci peut être facilement étendu pour faire ce que vous voulez avec un joint de la propriété, de sorte que vous pouvez faire quelque chose comme
UserText.Value="{Binding Xyz}"
qui met à jour le texte à l'aide de la méthode dans cette réponse lorsqu'il change au lieu d'utiliser la propriété Text directement. Je sais que cette réponse est vieux, mais peut-être d'intérêt pour quelqu'un qui vient par elle maintenant.OriginalL'auteur Pixar21
Je pense que vous avez à regarder certaines approches alternatives,comme
http://blog.notifychanged.com/2009/01/30/using-the-viewmodel-pattern-to-provide-undo-redo-in-wpf/
Permettant également la zone de texte pour gérer la undostack semble avoir quelques problèmes de fuite de mémoire voir ici
http://www.infosysblogs.com/microsoft/2008/03/wpf_textbox_memory_leak_issue_1.html
Aaaaand première ling disparu.
OriginalL'auteur biju
La zone de texte appliquer les modifications à l'intérieur de la pile d'annulation si elles sont appliquées de telle manière qu'ils semblent venir de l'utilisateur, comme suit:
C'est un terrible solution de contournement, car il tue tout ce que l'utilisateur a sur le presse-papiers (la restauration de ce qui est pessimiste discuté ici: Comment puis-je sauvegarder et restaurer le presse-papiers du système en C#?) mais j'ai pensé qu'il pourrait être utile d'avoir posté tout de même.
OriginalL'auteur MatrixManAtYrService
Donc, je pense que le ViewModel Annuler/Refaire l'article est bon, mais c'est comme le ViewModel motif que c'est sur la façon d'écrire personnalisé Annuler/Rétablir la fonctionnalité. Aussi, en réponse à confusedGeek, je pense qu'il pourrait y avoir des exemples de cas où l'annulation des modifications dans votre modèle, pas seulement dans votre commande individuelle approprié (disons que vous avez eu un contrôle textbox et un curseur à la fois lié à l'échantillon de la propriété, vous voulez annuler une modification indépendamment de contrôle, de sorte que nous parlons application d'annulation de niveau au lieu de contrôle de niveau).
Que, ici, c'est simple, si ce n'est un peu kludgey exemple de faire précisément ce que vous demandez l'aide d'un CommandBinding et simpliste pile d'annulation:
Et voici le code XAML:
Dans cet exemple, le comportement est légèrement différent que ce qui est typique de zone de texte annuler comportement parce que 1) je suis ignorant de sélection, et 2) je ne suis pas de regroupement sur plusieurs touches en une seule étape d'annulation, qui sont les deux choses que vous voulez à considérer dans une application réelle, mais il devrait être relativement simple à mettre en œuvre vous-même.
OriginalL'auteur Paul Wheeler