
Test Binding DatePicker
Hace poco tuve la oportunidad de trabajar con el DatePicker del WPFToolkit, pero tuve algunas complicaciones al momento de manejarlo con Bindings. El problema era el siguiente:
Al momento de realizar el binding con el DatePicker, me visualizaba los datos en el textbox de la fecha pero al momento de seleccionar otra fecha esta no se actualizaba en la entidad, esto debido a que en el Binding se actualizaba usando UpdateSourceTrigger=Explicit (asi lo requeria mi funcionalidad).
Escarbando un poco y apoyandome de los compañeros del equipo de trabajo logré realizar la funcionalidad requerida usando la interfaz INotifyPropertyChanged en mi entidad. A continuación muestra la forma en que resolvi el problema con un pequeño ejemplo:
XAML:
<Window x:Class="TestBindingDatePicker.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:wpfToolKit="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit"
Title="Window1" Height="300" Width="300">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="30" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<wpfToolKit:DatePicker x:Name="txtCalFecha" SelectedDate="{Binding Path=FechaHora, Mode=TwoWay, UpdateSourceTrigger=Explicit}" Grid.Row="0" />
<ListBox x:Name="lstDatosEntidad" Grid.Row="1"/>
</Grid>
</Window>
Metodo que inicializa el caso de uso:
private void Iniciar()
{
CargarDatos();
LlenarListaEntidades();
DataContext = lstDatosEntidad.SelectedItem;
AgregarDelegados();
}
Método que llena la lista de entidades con valores:
private void CargarDatos()
{
DatosPrueba prueba = null;
listaEntidades = new List<DatosPrueba>();
for(int i=1; i< 10; i++)
{
prueba = new DatosPrueba();
prueba.FechaHora = new DateTime(DateTime.Today.Year, DateTime.Today.Month, i);
listaEntidades.Add(prueba);
}
}
Método que llena el ListBox:
private void LlenarListaEntidades()
{
lstDatosEntidad.ItemsSource = listaEntidades;
lstDatosEntidad.DisplayMemberPath = "FechaHora";
lstDatosEntidad.SelectedIndex = 0;
}
Método para suscribir el formulario a los delegados de la lista y el calendario:
private void AgregarDelegados()
{
lstDatosEntidad.SelectionChanged += new System.Windows.Controls.SelectionChangedEventHandler(lstDatosEntidad_SelectionChanged);
txtCalFecha.SelectedDateChanged += new EventHandler<System.Windows.Controls.SelectionChangedEventArgs>(txtCalFecha_SelectedDateChanged);
}
Delegado que se ejecuta al cambiar el valor seleccionado en la lista, se actualiza el DataContext:
private void lstDatosEntidad_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
DataContext = lstDatosEntidad.SelectedItem;
}
Y por último actualizamos el binding del DatePicker haciendo un UpdateSource sobre el objeto DependencyProperty, en este punto es donde me fallaba ya que la variable de tipo BindingExpression siempre venia como null.
private void txtCalFecha_SelectedDateChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
BindingExpression be = txtCalFecha.GetBindingExpression(DatePicker.SelectedDateProperty);
if (be != null)
be.UpdateSource();
}
Para que funcionara correctamente se implementó la interfaz en mi entidad y se agregó el método OnPropertyChanged y de igual forma se invoco este al momento de actualizar la propiedad que se usa en el Binding, quedando de la siguiente forma:
class DatosPrueba :INotifyPropertyChanged
{
DateTime fechaHora;
public event PropertyChangedEventHandler PropertyChanged;
public DatosPrueba()
{
}
public DateTime FechaHora
{
get
{
return fechaHora;
}
set
{
fechaHora = value;
OnPropertyChanged("FechaHora");
}
}
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(name));
}
}
Espero que les sea util, a mi me costo algo de trabajo encontrar la solución asi que ahi se los dejo. Saludos…

Comments
There are no comments on this entry.