[WP] UpdateSourceTrigger = PropertyChanged

En Windows Phone Silverlight simplemente no podemos hacer esto y en teoría tenemos que esperar hasta que un LostFocus ocurra. Felizmente solo se tienen que hacer un par de cosas para obtener el comportamiento esperado cuando hacemos nuestros Binding.

Primero

Definimos una clase con un Attached Property, en mi caso estoy llamando UpdateSourceOnPropertyChanged a la clase y Value al Attached Property.

namespace MyPhoneApp.Phone.Classes
{
public class UpdateSourceOnPropertyChanged
{
public static bool GetValue(DependencyObject obj)
{
return (bool)obj.GetValue(ValueProperty);
}

public static void SetValue(DependencyObject obj, bool value)
{
obj.SetValue(ValueProperty, value);
}

public static readonly DependencyProperty ValueProperty =
DependencyProperty.RegisterAttached("Value", typeof(bool), typeof(UpdateSourceOnPropertyChanged), new PropertyMetadata(false, Callback));

private static void Callback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if ((bool)e.NewValue)
{
if (d is TextBox)
((TextBox)d).TextChanged += TextBox_TextChanged;

if (d is PasswordBox)
((PasswordBox)d).PasswordChanged += PasswordBox_PasswordChanged;
}
else
{
if (d is TextBox)
((TextBox)d).TextChanged -= TextBox_TextChanged;

if (d is PasswordBox)
((PasswordBox)d).PasswordChanged -= PasswordBox_PasswordChanged;
}
}

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

private static void PasswordBox_PasswordChanged(object sender, RoutedEventArgs e)
{
((PasswordBox)sender).GetBindingExpression(PasswordBox.PasswordProperty).UpdateSource();
}
}
}

Segundo

Por último agregar en nuestro View la referencia al namespace correspondiente a la clase creada.

<phone:PhoneApplicationPage
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:be="clr-namespace:MyPhoneApp.Phone.Classes"
...
>

Y agregar el Attached Property a nuestros controles y definir UpdateSourceTrigger=Explicit en los Binding.

            <StackPanel>
<TextBox x:Name="txb" Text="{Binding Hello, Mode=TwoWay, UpdateSourceTrigger=Explicit}" be:UpdateSourceOnPropertyChanged.Value="True"/>
<PasswordBox x:Name="pwd" Password="{Binding Hello, Mode=TwoWay, UpdateSourceTrigger=Explicit}" be:UpdateSourceOnPropertyChanged.Value="True"/>
<TextBlock Text="{Binding Hello}" />
</StackPanel>

PDT: Tener en cuenta que si se desea hacer el Attach o Deattach desde el código .cs se puede hacer lo siguiente:

            UpdateSourceOnPropertyChanged.SetValue(txb, false);
UpdateSourceOnPropertyChanged.SetValue(pwd, false);

Agregue un comentario

Su dirección de correo no se hará público.