2010-03-30 1 views
7

Ich erstelle eine numerische TextBox in WPF, mit zwei Schaltflächen, um den Wert zu erhöhen und zu verringern.Wie erzwinge ein TextChanged-Ereignis in einem WPF TextBox und den Fokus beibehalten?

Ich habe zwei RoutedCommand, um den Behiavor zu verwalten, und sie funktionieren gut. Es gibt nur ein Problem, das ich gerne lösen würde. Ich möchte, dass die Steuerung alle Objekte, die an ihre TextProperty gebunden sind, benachrichtigt, wenn ein Befehl zum Erhöhen oder Verringern ausgeführt wird.

Im Moment ist es die Benachrichtigung nur sendet, wenn ich den Fokus auf eine andere Steuerung ändern wird

Jede Hilfe wirklich zu schätzen, Danke

Antwort

11

UpdateSourceTrigger="Explicit" Verwendung in der Bindung und in TextChanged Ereignisse aktualisiert die BindingSource. so Sie schreiben etwas wie folgt aus:

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

statt wie zu tun diese

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

und in TextChanged Event-Handler, die Bindung aktualisieren.

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

und das ist getan. Hoffe es hilft !!

+0

@viky vielen Dank! Ich vergaß, dass das möglich war benutze den Ausdruck "control.GetBindingExpression (NumericTextBox.TextProperty) .UpdateSource();" das ist perfekt. Ich rufe es nur an, wenn der Benutzer die Tasten zum Erhöhen und Verringern erhöht und das normale Verhalten verwendet, wenn der Text manuell geändert wird. – Drake

+7

Warum nicht einfach 'Text =" {Binding YourBindableProperty, UpdateSourceTrigger = PropertyChanged} "'? –

2

Das Standardverhalten für die Bindung der Eigenschaft Text auf einem TextBox ist auf LostFocus zu aktualisieren. Sie können dies in Ihrem statischen Ctor auf den TextProperty durch Überschreiben die Metadaten in dem benutzerdefinierten Steuerelement ändern:

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 danke Abe, sehr nützlich, aber viky Antwort ist flexibler für meinen Fall – Drake

25

Es ist eine einfache Art und Weise:

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

(ich es auf TextBox getestet). Viel Glück

+1

+1. 'Text =" {Binding MyTextProperty, UpdateSourceTrigger = PropertyChanged} "scheint der beste Weg zu sein. –