2010-03-30 13 views
7

Sto creando un TextBox numerico in WPF, con due pulsanti per aumentare e diminuire il valore.Come forzare un evento TextChanged su un TextBox WPF e mantenere l'attenzione?

devo creare due RoutedCommand per gestire il behiavor e stanno lavorando bene. C'è solo un problema che vorrei risolvere. Mi piacerebbe che il controllo notificasse tutti gli oggetti associati alla sua TextProperty quando viene eseguito un comando di aumento o diminuzione.

Al momento invia la notifica solo quando cambio la messa a fuoco su un altro controllo

Ogni aiuto è molto apprezzato, Grazie

risposta

11

Usa UpdateSourceTrigger="Explicit" nel legame e nel TextChanged evento di aggiornamento della BindingSource. in modo che si sta scrivendo qualcosa di simile:

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

invece ti piace questo

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

e in TextChanged gestore di eventi aggiornare il legame.

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

e questo è fatto. Spero che aiuti !!

+0

@viky grazie mille! Ho dimenticato che era possibile usare l'espressione "control.GetBindingExpression (NumericTextBox.TextProperty) .UpdateSource();" è perfetto. Lo chiamo solo quando l'utente preme i pulsanti aumenta e diminuisci e usa il comportamento normale quando cambia testo manualmente. – Drake

+7

Perché non usare semplicemente 'Text =" {Binding YourBindableProperty, UpdateSourceTrigger = PropertyChanged} "'? –

2

Il comportamento predefinito per il binding della proprietà Text su un deve essere aggiornato su LostFocus. È possibile modificare questo nel vostro controllo personalizzato sovrascrivendo i metadati sul TextProperty nel ctor statica:

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 grazie Abe, molto utile ma la risposta in viky è più flessibile per il mio caso – Drake

25

C'è un modo semplice:

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

(l'ho testato su TextBox). Good Luck

+1

+1. 'Text =" {Binding MyTextProperty, UpdateSourceTrigger = PropertyChanged} "' sembra essere il modo migliore per andare. –

Problemi correlati