“UpdateSourceTrigger = PropertyChanged” equivalente per un TextBox di Windows Phone 7

C’è un modo per ottenere un TextBox in Windows Phone 7 per aggiornare il Binding mentre l’utente digita ogni lettera piuttosto che dopo aver perso l’attenzione?

Come il seguente TextBox WPF farebbe:

 

Silverlight per WP7 non supporta la syntax che hai elencato. Fai invece quanto segue:

  

UpdateSourceTrigger = Explicit è un bonus intelligente qui. Che cos’è? Esplicito : aggiorna l’origine UpdateSource solo quando si chiama il metodo UpdateSource . Ti salva un set di rilegatura aggiuntivo quando l’utente lascia il TextBox .

In C #:

 private void OnTextBoxTextChanged( object sender, TextChangedEventArgs e ) { TextBox textBox = sender as TextBox; // Update the binding source BindingExpression bindingExpr = textBox.GetBindingExpression( TextBox.TextProperty ); bindingExpr.UpdateSource(); } 

Mi piace usare una proprietà associata. Nel caso fossi in quei piccoli bastardi.

    

E poi il codice di supporto.

 public class BindingUtility { public static bool GetUpdateSourceOnChange(DependencyObject d) { return (bool)d.GetValue(UpdateSourceOnChangeProperty); } public static void SetUpdateSourceOnChange(DependencyObject d, bool value) { d.SetValue(UpdateSourceOnChangeProperty, value); } // Using a DependencyProperty as the backing store for … public static readonly DependencyProperty UpdateSourceOnChangeProperty = DependencyProperty.RegisterAttached( "UpdateSourceOnChange", typeof(bool), typeof(BindingUtility), new PropertyMetadata(false, OnPropertyChanged)); private static void OnPropertyChanged (DependencyObject d, DependencyPropertyChangedEventArgs e) { var textBox = d as TextBox; if (textBox == null) return; if ((bool)e.NewValue) { textBox.TextChanged += OnTextChanged; } else { textBox.TextChanged -= OnTextChanged; } } static void OnTextChanged(object s, TextChangedEventArgs e) { var textBox = s as TextBox; if (textBox == null) return; var bindingExpression = textBox.GetBindingExpression(TextBox.TextProperty); if (bindingExpression != null) { bindingExpression.UpdateSource(); } } } 

Non attraverso la syntax vincolante, no, ma è abbastanza facile senza. Devi gestire l’evento TextChanged e chiamare UpdateSource sull’associazione.

 private void TextBox_TextChanged(object sender, TextChangedEventArgs e) { ((TextBox) sender).GetBindingExpression( TextBox.TextProperty ).UpdateSource(); } 

Questo può essere convertito in un comportamento collegato abbastanza facilmente.

Nell’evento TextChanged chiama UpdateSource () .

 BindingExpression be = itemNameTextBox.GetBindingExpression(TextBox.TextProperty); be.UpdateSource(); 

È ansible scrivere il proprio comportamento TextBox per gestire l’aggiornamento su TextChanged:

Questo è il mio esempio di PasswordBox ma puoi cambiarlo facilmente per gestire qualsiasi proprietà di qualsiasi object.

 public class UpdateSourceOnPasswordChangedBehavior : Behavior { protected override void OnAttached() { base.OnAttached(); AssociatedObject.PasswordChanged += OnPasswordChanged; } protected override void OnDetaching() { base.OnDetaching(); AssociatedObject.PasswordChanged -= OnPasswordChanged; } private void OnPasswordChanged(object sender, RoutedEventArgs e) { AssociatedObject.GetBindingExpression(PasswordBox.PasswordProperty).UpdateSource(); } } 

ussage:

      

UpdateSourceTrigger = Explicit non funziona per me, quindi sto usando una class personalizzata derivata da TextBox

 public class TextBoxEx : TextBox { public TextBoxEx() { TextChanged += (sender, args) => { var bindingExpression = GetBindingExpression(TextProperty); if (bindingExpression != null) { bindingExpression.UpdateSource(); } }; } } 

È solo una riga di codice!

 (sender as TextBox).GetBindingExpression(TextBox.TextProperty).UpdateSource(); 

Puoi creare un evento TextChanged generico (ad esempio “ImmediateTextBox_TextChanged”) nel codice retrostante della tua pagina e poi collegarlo a qualsiasi TextBox nella pagina.

Ho preso la risposta di Praetorian e ho creato una class di estensione che eredita TextBox modo da non dover intralciare il codice della tua vista con questo comportamento.

C-Sharp :

 public class TextBoxUpdate : TextBox { public TextBoxUpdate() { TextChanged += OnTextBoxTextChanged; } private void OnTextBoxTextChanged(object sender, TextChangedEventArgs e) { TextBox senderText = (TextBox)sender; BindingExpression bindingExp = senderText.GetBindingExpression(TextBox.TextProperty); bindingExp.UpdateSource(); } } 

VisualBasic :

 Public Class TextBoxUpdate : Inherits TextBox Private Sub OnTextBoxTextChanged(sender As Object, e As TextChangedEventArgs) Handles Me.TextChanged Dim senderText As TextBox = DirectCast(sender, TextBox) Dim bindingExp As BindingExpression = senderText.GetBindingExpression(TextBox.TextProperty) bindingExp.UpdateSource() End Sub End Class 

Quindi chiama in questo modo in XAML :