10
votes

Comment atteindre la réinitialisation de la mise au point pour mettre à jour la liaison de la zone de texte avant toute action

J'ai observé un comportement inattendu ou au moins non-parfaitement correspondant - mes besoins de textes de textes liés à textproperties lorsque je ne peux pas utiliser à l'aide de UpdateTrigger = PropertyChanged pour ma liaison. Ce n'est probablement pas un problème avec la zone de texte mais se produira également avec d'autres éditeurs également.

dans mon exemple (code source ci-joint), j'ai un TabControl WPF à une collection. Sur chaque onglet, vous pouvez modifier un élément de la collection, de différentes manières que vous pouvez déclencher une action de sauvegarde, ce qui doit enregistrer les modifications à un modèle. Les zones de texte liées à chaque propriétés d'éléments sont (exprès) sont conservées à la mise à jour par défaut - déclencheur 'Onfocuslost'. En effet, une validation coûteuse a lieu lorsqu'une nouvelle valeur est définie.

Maintenant, j'ai trouvé qu'il y a au moins deux façons de déclencher mon action de sauvegarde de telle manière que la dernière zone de texte ciblée ne pas mettre à jour la valeur liée. 1) Modification de l'élément d'onglet via la souris-cliquez sur son en-tête, puis cliquez sur le bouton Enregistrer. (Le remplacement de l'onglet précédent montre que la nouvelle valeur est même perdue) 2) Déclencher la commande de sauvegarde via Clearsture.

i Configurez un exemple d'application qui démontre le comportement. En cliquant sur "Enregistrer tous" affichera toutes les valeurs d'élément, l'autre bouton de sauvegarde indique uniquement l'élément actuel.

q: Quelle serait la meilleure façon de s'assurer que tout Les litres de toutes mes zones de texte seront mis à jour avant que les objets liés soient comisés? De préférence, il devrait y avoir une seule façon qui attrape toutes les possibilités, je n'aime pas attraper chaque événement différemment, car je crains d'avoir oublié certains événements. Observer l'événement de sélection-modifié du contrôle de tabulation, par exemple, résoudrait la question 1) mais pas émettre 2).

maintenant à l'exemple:

XAML: > xxx

et la classe correspondante xxx


1 commentaires

Pour plus de commodité, j'ai utilisé la commande d'arrêt, s.t. Pour la plupart des utilisateurs, appuyer sur [ESC] devrait déclencher l'action.


3 Réponses :


0
votes

1 commentaires

Je suis désolé, ce n'est pas le cas. Il peut s'entraîner, mais si j'utilise une mise à jour explicite, je devrai mettre à jour toutes mes liaisons manuellement dans Code-Ber, par exemple. avant d'économiser. Donc, s'il y a plus d'une action possible, chaque action doit s'occuper de la première mise à jour de toutes les liaisons, ce que j'aimerais éviter. (Raison pour cela: je veux découpler l'objet lié de la vue en fonction du motif MV-VM, la commande sauvegarde ne doit donc pas "savoir" la vue du tout et n'accumule pas les liaisons à ses propriétés) de toute façon, merci, Pour votre réponse, j'avais déjà renoncé à recevoir des commentaires.



1
votes

Vous pouvez écrire un style ciblant toutes les zones de texte, dans lesquelles vous auriez un événement d'événements sur les événements GotFocus ou GotkeyboardFocus, ainsi que sur des événements complémentaires LostFocus. Dans le gestionnaire associé aux événements GotFocus, vous définiriez une variable booléenne "CANVESAVE" à FALSE, que dans le gestionnaire de LostFocus, vous revenez à True. Tout ce que vous avez à faire est de vérifier avant de sauvegarder si votre variable vous permet également. Sinon, vous pouvez en informer l'utilisateur ou simplement changer la mise au point de la zone de texte sur autre chose. De cette façon, la mise à jour de la liaison à la mise à jour de la zone de texte actuellement modifiée déclenchera de manière appropriée lorsque sa mise au point est perdue.


1 commentaires

Malheureusement, lors de la commutation de l'onglet Sélectionné, la zone de texte dans l'ancien onglet ne recevra jamais l'événement LostFocus, qui est un bogue dans WPF, je dirais. C'est pourquoi l'updatetrigger (étant perdueFocus) n'est jamais déclenché automatiquement. Donc, votre solution ne m'aidera pas dans ce cas. Néanmoins +1 pour me conduire à l'examen de tous les événements liés au focus, j'ai trouvé une voie de renaissance rapide pour le faire.



3
votes

Peut-être que ce n'est pas agréable de répondre à vos propres questions, mais je pense que cette réponse est plus adaptée à la question que d'autres, et il vaut donc la peine d'être écrit. C'était sûrement c'était aussi parce que je n'ai pas décrit le problème assez clairement.

Enfin, comme une preuve de concept rapide, j'ai travaillé autour de cela comme ceci: L'événement LostFocus n'est jamais tiré sur la zone de texte, lorsque je chante l'onglet. Par conséquent, la liaison ne se met pas à jour et la valeur entrée est perdue, car la commutation en arrière rend l'actualisation de la liaison à partir de sa source. Mais ce qui est tiré est l'événement PreviewLostFocus, donc je suis accroché dans cette minuscule fonction, qui déclenche manuellement la mise à jour de la source de liaison: xxx

la sortie en fonction de la chaîne d'événement Avec PreviewlostFocus, LostFocus (à partir de la zone de texte) et SelectionChanged (de TabControl) ressemblera à ceci:

Aperçu Preview Focus: Textbox Valeur Smith123456 / Valeur des données John Smith123 Newfocus sera System.Windows.Controls.Tabitem Header: Peter Miller contenu: Peter Miller Aperçu de la mise à jour perdue Mise à jour forcée: Textbox Valeur Smith123456 / Valeur des données John Smith123456 Newfocus sera System.Windows.controls.Tabitem Header: Peter Miller contenu: Peter Miller La sélection a changé de System.Object [] à System.Object [] Prévisualisation Perte Focus: Valeur de TextBox Miller / Valeur de données Peter Miller Newfocus sera System.Windows.controls.TextBox: Peter Aperçu Lost Focus Mise à jour forcée: Valeur de la boîte de texte Miller / Valeur de données Peter Miller Newfocus sera System.Windows.Controls.TextBox: Peter Mise au point perdue ayant de la valeur Miller

Nous voyons que le lostfocus ne se produit qu'à la fin, mais pas avant de changer le Tabitem. Je pense toujours que c'est étrange, éventuellement un bogue dans WPF ou dans les modèles de contrôle standard. Merci à tous pour vos suggestions, désolé, je ne pouvais pas vraiment les signer pour être des réponses, car ils ne résolvent pas la perte d'entrées sur les changements à tabulation.


2 commentaires

C'est certainement acceptable de répondre à votre propre question.


Cette réponse m'a eu sur la bonne voie pour mon problème particulier; Je suive la prise de gain / perte de clavier sur les commandes d'édition de texte dans une structure d'élément modélisée / entraînée par des données. Lorsque les contextes liés ont changé (invalidation de la structure), la zone de texte avec mise au point peut être supprimée sans aucune notification de perte de mise au point. J'ai essayé la réponse suggérée (en accrochant l'événement de la prévisualisationBoardFocusLoss sur le contrôle), mais il n'a même pas eu la chance de tirer. Je me suis installé sur l'accrochage de l'événement non chargé, car cela déclenche sur la structure change me donnant l'occasion de ranger. Merci. :)