2011-04-12 17 views
7

Me di cuenta de que los enlaces con UpdateSourceTrigger==LostFocus no se actualizan cuando el usuario activa el menú o la barra de herramientas.Enlace con UpdateSourceTrigger == LostFocus no se activa para la interacción de Menú o Barra de herramientas

Esto lleva a la desafortunada situación de que el último cambio que hizo el usuario se pierde cuando el usuario selecciona "Guardar archivo" en el menú o la barra de herramientas.

Hay una manera fácil de evitar esto o tengo que cambiar todas mis fijaciones a UpdateSourceTrigger=PropertyChanged.

Respuesta

2

El problema es que el TextBox, de hecho, no pierde el foco cuando el elemento del menú está activado. Por lo tanto, UpdateSourceTrigger LostFocus no se activa. Dependiendo de su modelo (vista), UpdateSourceTrigger PropertyChanged podría o no ser una solución factible.

Para mí, PropertyChanged no era una opción (que necesito para validar los datos después de que el usuario terminado entrar en él, no en el medio), por lo que utiliza una solución llamando a este método antes de "Guardar archivo" (o cualquier otra entrada del menú/barra de herramientas que requiere un modelo de arriba-hasta la fecha):

Public Shared Sub SaveFocusedTextBox() 
    Dim focusedTextBox = TryCast(Keyboard.FocusedElement, TextBox) 
    If focusedTextBox IsNot Nothing Then 
     Dim be = focusedTextBox.GetBindingExpression(TextBox.TextProperty) 
     If be IsNot Nothing Then be.UpdateSource() 
    End If 
End Sub 

algunos otros enfoques para este problema se puede encontrar en esta pregunta relacionada:

(De hecho, el crédito por este método va a la respuesta de rudigrobler en esta pregunta.)

+0

danke heinzi und Grüße aus dem 4. bezirk;) – thumbmunkeys

+0

@IErbaer: Grüße zurück, auch aus dem 4. Bezirk. [Sitze gerade an der TU]. ;-) – Heinzi

+0

¡Sin embargo, pierde el enfoque, esa es la cuestión! P.ej. está en un cuadro de texto y tabula en un elemento de menú. –

3

Esto funciona bien para mí:

Private Sub MenuItem_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) 

    Keyboard.FocusedElement.RaiseEvent(New RoutedEventArgs With {.RoutedEvent = LostFocusEvent}) 

End Sub 
10

Sé que esto es un poco viejo, pero para cualquier lector, sólo hay que establecer lo siguiente en mi ToolBar trabajó para mí:

FocusManager.IsFocusScope="False" 
+2

viejo, pero no olvidado :) – thumbmunkeys

+0

Hacerme más viejo ... Por lo tanto, me gusta una solución tan simple pero me preocupa que haya algún otro control en algún lugar o algo que agregue más tarde que tampoco provoque que el cuadro de texto pierda el foco. ¿Algunas ideas? – sraboy

+0

@sraboy: No estoy seguro si te entendí correctamente, pero esta configuración solo afectará el control en el que la aplicas, no los controles recién agregados. – dotNET

Cuestiones relacionadas