In der folgenden einfachen WPF-Anwendung wird ein TextBox
so eingestellt, dass eine Eigenschaft aktualisiert wird, wenn der Fokus von diesem Steuerelement verloren geht, wie zum Beispiel
Wenn ich diese Anwendung ausführe, geben Sie jedoch einen Text in das Textfeld ein und klicken dann auf die Schaltfläche "Test". Mein Haltepunkt in der MyString
-Eigenschaft ist nicht und auch kein Ereignishandler für Das Ereignis FocusLost
wird ebenfalls nicht ausgelöst. Diese Ereignisse werden nur ausgelöst, wenn der Fokus von der Steuerung auf andere Weise verloren geht (z. B. wenn das Fenster geschlossen ist).
Dies verursacht Probleme für uns, da in Wirklichkeit die "Test" -Schaltfläche eine Logik enthält, die darauf beruht, dass die Eigenschaft MyString
aktualisiert wird.
Wie kann ich sicherstellen, dass das Ereignis FocusLost
korrekt ausgelöst wird und die Bindung aktualisiert wird, wenn ich auf die Schaltfläche "Test" klicke? Es scheint, dass das Problem irgendwie durch die Verwendung von ToolBar
verursacht wird, da das Ersetzen von ToolBar
durch eine Standardschaltfläche nicht zu diesem Verhalten führt.
In diesem Fall verliert das Textfeld nicht den logischen Fokus und daher wird das Ereignis nie ausgelöst - im Wesentlichen möchte ich, dass das LostKeyboardFocus
-Ereignis und nicht das LostFocus
-Ereignis das Update auslöst.
Dieses Problem ähnelt WPF: Datengebunden TabControl gibt keine Änderungen aus, wenn die neue Registerkarte ausgewählt ist und es gibt ein Microsoft Connect-Element dafür hier mit einer Reihe von möglichen Lösungen, jedoch habe ich dies mit einer angehängten Eigenschaft wie folgt behoben.
%Vor% Dies bedeutet nur, dass, wenn LostKeyboardFocus
für dieses Steuerelement ausgelöst wird, es weitergeht und ein zusätzliches LostFocus
-Ereignis auslöst, wodurch die Bindung aktualisiert wird. Es ist so verwendet
Ihre angefügte Eigenschaft macht einige Annahmen:
LostKeyboardFocus
und LostFocus
events LostFocus
-Ereignis reagieren (sie könnten UpdateSourceTrigger.Explicit ) Stattdessen können Sie die Bindungen für das Element aufzählen und direkt aufrufen UpdateSource :
%Vor% Anstatt jeden TextBox
einzeln zu behandeln, könnten Sie auch den Container behandeln und OldFocus , um das tatsächliche Element zu erhalten, das den Tastaturfokus verloren hat.
Das folgende Verhalten wird das beheben:
%Vor%Sie können es wie folgt an Ihre TextBox anhängen:
%Vor%Tags und Links wpf focus toolbar lost-focus