This article has been localized into Spanish by the community.
La propiedad UpdateSourceTrigger
En el artículo anterior vimos como los cambios en un TextBox no se enviaban inmediatamente a la fuente. En cambio, la fuente se actualizaba únicamente después que el TextBox perdía el foco. Este comportamiento es controlado por una propiedad del binding llamada UpdateSourceTrigger. Su valor por defecto "Default", básicamente significa que la fuente es actualizada basándose en la propiedad a la cual lo has enlazado. Al momento de escribir esto, todas las propiedades excepto la propiedad Text, son actualizadas tan pronto como la propiedad cambia (PropertyChanged), mientras que la propiedad Text es actualizada cuando el foco en el elemento de destino se pierde (LostFocus).
Default es, obviamente, el valor por defecto del UpdateSourceTrigger. Las otras opciones son PropertyChanged, LostFocus y Explicit. Las primeras dos ya fueron descritas, mientras que la última simplemente significa que la actualización se tiene que disparar manualmente para que ocurra, usando una llamada a UpdateSource en el Binding.
Para ver como funcionan todas estas opciones, He actualizado el ejemplo del capítulo anterior para mostrarte todas ellas:
<Window x:Class="WpfTutorialSamples.DataBinding.DataContextSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="DataContextSample" Height="130" Width="310">
<StackPanel Margin="15">
<WrapPanel>
<TextBlock Text="Window title: " />
<TextBox Name="txtWindowTitle" Text="{Binding Title, UpdateSourceTrigger=Explicit}" Width="150" />
<Button Name="btnUpdateSource" Click="btnUpdateSource_Click" Margin="5,0" Padding="5,0">*</Button>
</WrapPanel>
<WrapPanel Margin="0,10,0,0">
<TextBlock Text="Window dimensions: " />
<TextBox Text="{Binding Width, UpdateSourceTrigger=LostFocus}" Width="50" />
<TextBlock Text=" x " />
<TextBox Text="{Binding Height, UpdateSourceTrigger=PropertyChanged}" Width="50" />
</WrapPanel>
</StackPanel>
</Window>
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
namespace WpfTutorialSamples.DataBinding
{
public partial class DataContextSample : Window
{
public DataContextSample()
{
InitializeComponent();
this.DataContext = this;
}
private void btnUpdateSource_Click(object sender, RoutedEventArgs e)
{
BindingExpression binding = txtWindowTitle.GetBindingExpression(TextBox.TextProperty);
binding.UpdateSource();
}
}
}
Como puedes ver, ahora cada uno de los tres texboxes usa un UpdateSourceTrigger diferente.
El primero está establecido como Explicit, que básicamente significa que la fuente no será actualizada al menos que lo hagas manualmente. Por esta razón, he añadido un botón al lado de la caja de texto, el cual actualizará el valor de la fuente cuando se le pida. En el código c# (Code-behind), encontrarás el manejador del evento Click, donde usamos un par de lineas de código to conseguir el enlace desde el control destino y entonces llamar al método UpdateSource() en él.
La segunda caja de texto usa el valor LostFocus, el cual es el que viene por defecto para los enlaces de texto. Esto significa que el valor de la fuente será actualizado cada vez que el control destino pierda el foco.
La tercera y última caja de texto usa el valor PropertyChanged, lo cual quiere decir que el valor de la fuente será actualizado cada vez que la propiedad ligada cambie, lo cual hace en este caso, tan pronto como el texto cambia.
Prueba a ejecutar el ejemplo en tu propia máquina y observa como las tres cajas de texto actúan de forma completamente diferente: el primer valor no se actualiza hasta que no pinches en el botón, el segundo valor no se actualiza hasta que no abandones la caja de texto, mientras que el tercer valor se actualiza automáticamente cada vez que pulsas una tecla o cambia el texto, etc.
Resumen
La propiedad UpdateSourceTrigger de un enlace controla como y cuando un cambio es enviado a la fuente. De todas formas, WPF es muy bueno controlando esto por tí, el valor por defecto debería ser suficiente en la mayoría de los casos, donde conseguirás el mejor equilibrio entre una constante actualización de la UI y un buen rendimiento.
Para aquellas situaciones que tu necesites más control del proceso, esta propiedad definitivamente te ayudará con ello. Simplemente asegúrate que no actualizas el valor de la fuente más a menudo de lo que realmente necesitas. Si quieres un control total, puedes usar el valor Explicit y entonces debes hacer las actualizaciones manualmente, pero esto le quita un poco de gracia al trabajar con los enlaces de datos.