venerdì 15 ottobre 2010

WP7: Eseguire il binding in un TextBox mentre l’utente scrive

Quando utilizziamo un controllo TextBox all’interno della nostra App per WP7, siamo abituati al fatto che il binding verso la sorgente dati avviene nel momento in cui il TextBox stesso perde il fuoco.

Per ovviare a questo e fare in modo che il binding venga eseguito ad ogni pressione di un carattere sulla tastiera da parte dell’utente possiamo ricorrere ad un TriggerAction.

Realizziamo una classe derivata da TriggerAction che ci permetterà di reagire al cambiamento del testo all’interno del TextBox e “forzare” il binding.

  1. public class TextBoxTextPropertyChangedAction : TriggerAction<TextBox>
  2. {
  3.     protected override void Invoke(object o)
  4.     {
  5.         var be = this.AssociatedObject.GetBindingExpression(TextBox.TextProperty );
  6.         if (be!=null) be.UpdateSource();
  7.     }
  8. }

In questo caso gestiamo l’override del metodo Invoke(), recuperiamo l’espressione di binding sull’oggetto associato al trigger (in questo caso un textbox perché la nostra classe deriva dalla TriggerAction<TextBox>) e, se l’espressione di binding esiste, forziamo l’update del binding stesso.

Per poter montare il trigger su un TextBox è sufficiente scrivere:

  1. <TextBox Text="{Binding proprieta, Mode=TwoWay,BindsDirectlyToSource=True}">
  2.     <custom:Interaction.Triggers>
  3.         <custom:EventTrigger EventName="TextChanged">
  4.             <action:TextBoxTextPropertyChangedAction />
  5.         </custom:EventTrigger>
  6.     </custom:Interaction.Triggers>
  7. </TextBox>

dove custom e action sono i namespace relativi, rispettivamente, a System.Windows.Interactivity e alla nostra classe TextBoxPropertyChangedAction:

  1. xmlns:action="clr-namespace:MioNameapsce.Actions"
  2. xmlns:custom="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

Nel momento in cui l’utente comincia a digitare, e ogni volta che il testo cambia, verrà richiamato l’invoke e il binding verrà di nuovo eseguito.

 

Nessun commento: