2010-03-30 14 views
7

Estoy creando un TextBox numérico en WPF, con dos botones para aumentar y disminuir el valor.Cómo forzar un evento TextChanged en un WPF TextBox y mantener el foco?

Tengo crear 0 RoutedCommand para administrar el behiavor y están funcionando bien. Solo hay un problema que me gustaría resolver. Me gustaría que el control notifique a todos los objetos vinculados a su TextProperty cuando se ejecuta un comando de aumento o disminución.

En el momento en que envía la notificación sólo cuando se cambia el foco a otro control

Cualquier ayuda es muy apreciada, Gracias

Respuesta

11

Uso UpdateSourceTrigger="Explicit" en la unión y en TextChanged evento de actualización de la BindingSource. por lo que está escribiendo algo como esto:

<NumericTextBox x:Name="control" Text={Binding Path=MyProperty}/> 

vez me gusta esto

<NumericTextBox x:Name="control" Text={Binding Path=MyProperty, UpdateSourceTrigger=Explicit}/> 

y en TextChanged controlador de eventos actualizar la unión.

control.GetBindingExpression(NumericTextBox.TextProperty).UpdateSource(); 

y eso es todo. Espero que ayude !!

+0

@viky muchas gracias! Olvidé que era posible usar la expresión "control.GetBindingExpression (NumericTextBox.TextProperty) .UpdateSource();" Eso es perfecto. Lo llamo solo cuando el usuario presiona aumentar y disminuir botones y usa el comportamiento normal cuando se cambia el texto manualmente. – Drake

+7

¿Por qué no simplemente utiliza 'Text =" {Vinculando YourBindableProperty, UpdateSourceTrigger = PropertyChanged} "'? –

2

El comportamiento predeterminado para el enlace de la propiedad de texto en un TextBox es actualizar en LostFocus. Usted puede cambiar esto en el control personalizado reemplazando el metadatos en el TextProperty en su ctor estática:

static NumericTextBox() 
{ 
    TextProperty.OverrideMetadata(
     typeof(NumericTextBox), 
     new FrameworkPropertyMetadata("", // default value 
      FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, 
      null, // property change callback 
      null, // coercion callback 
      true, // prohibits animation 
      UpdateSourceTrigger.PropertyChanged)); 
} 
+0

@abe gracias Abe, muy útil pero la respuesta viky es más flexible para mi caso – Drake

25

No es una forma sencilla:

Text="{Binding Path=MyProperty, UpdateSourceTrigger=PropertyChanged}" 

(he comprobado en Cuadro de texto). Buena suerte

+1

+1. 'Text =" {Binding MyTextProperty, UpdateSourceTrigger = PropertyChanged} "' parece ser la mejor manera de hacerlo. –

Cuestiones relacionadas