DatePicker es un control conformado de un campo de texto y un calendario. Esto le da al usuario final la flexibilidad de escribir la fecha en el campo de texto o seleccionarla desde un calendario como el del post pasado. De hecho, muchas de las propiedades del DatePicker son para manejar el calendario de la misma manera en que manejamos el control Calendar.

Propiedades:

  • BlackoutDates – Los días en esta colección aparecerán tachados y no podrán ser seleccionados.
  • DisplayDate – Indica una fecha que será visible al momento de desplegarse, sin importar la fecha que esté seleccionada actualmente
  • DisplayDateStart y DisplayDateEnd – Indican el rango de fechas que serán visibles. Cualquier fecha fuera de este rango simplemente no aparecerá en el calendario.
  • FirstDateOfWeek – Primer día de la semana en el calendario (Sunday/Monday/Tuesday/Wednesday/Thursday/Friday/Saturday)
  • IsDropDownOpen – Indica si el calendario esta abierto
  • IsTodayHighlighted – Indica si queremos que el día actual esté resaltado (True/False)
  • SelectedDate – Fecha seleccionada
  • SelectedDateFormat – Formato de la fecha
    • Short – 27/07/2009
    • Long - lunes, 27 de julio de 2009
  • SelectionBackground – El color de fondo de la fecha seleccionada en el campo de texto
  • Text – Contenido del campo de text

Eventos:

  • CalendarClosed – Se dispara cuando el calendario se cierra
  • CalendarOpened – Se dispara cuando el calendario se abre
  • DateValidationError – Ocurre cuando el valor insertado en el campo de texto no puede ser interpretado como una fecha
  • SelectedDatesChanged – Se dispara cuando se cambia de fecha(s)seleccionada(s)

Nuevamente, debemos comenzar por agregar la referencia System.Windows.Controls a nuestro proyecto. Además de ponerla en nuestro MainPage.xaml:

1
<span style="color: #800000">UserControl</span> <span style="color: #ff0000">xmlns:controls</span><span style="color: #0000ff">=&quot;clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls&quot;</span>

Para ejemplificar las distintas propiedades y eventos del DatePicker, vamos a contruir un pequeño control que nos permita escoger dos fechas para reservar un boleto de avión. Primero, usamos Blend 3 para hace rápidamente una pequeña interfaz de usuario:

image

A continuación vamos a escribir toda lafuncionalidad en el archivo de código de nuestro control, en este caso, MainPage.cs. Vamos a bloquear las fechas anteriores al día actual:

1
<span style="color: #008000">//Bloqueamos las fechas pasadas</span>

1
fechaSalida.BlackoutDates.AddDatesInPast();

1
fechaRegreso.BlackoutDates.AddDatesInPast();

Cuando se selecciona la fecha de Salida queremos asegurarnos de que la fecha de Regreso sea igual o mayor. Para esto, agregamos un delegado al evento SelectedDateChanged del DatePick de salida:

1
fechaSalida.SelectedDateChanged +=

1
<span style="color: #0000ff">new</span> EventHandler&lt;SelectionChangedEventArgs&gt;(fechaSalida_SelectedDateChanged);

En dicho delegado reiniciamos el mensaje de error y las blackoutDates a los valores originales. Hacemos una validación para asegurarnos que si la fecha de Regreso ya había sido seleccionada y es menor a la nueva fecha de Salida, será reseteada a nulo. Agregamos a la colección BlackoutDates un rango de fechas entre el día actual y el día de Salida seleccionado menos uno (para no excluirlo). Nótese el uso de GetValueOrDefault() para la propiedad SelectedDate, esto es debido a que dicha propiedad es de tipo DateTime?, osea que es Nullable, y queremos asegurarnos de obtener un valor válido:

1
<span style="color: #0000ff">void</span> fechaSalida_SelectedDateChanged(<span style="color: #0000ff">object</span> sender, SelectionChangedEventArgs e)

1
{

1
<span style="color: #008000">//Reiniciamos mensaje de error</span>

1
textoErrorSalida.Text = <span style="color: #006080">&quot;&quot;</span>;

1
&#160;

1
<span style="color: #008000">//Reiniciamos las BlackoutDates</span>

1
fechaRegreso.BlackoutDates.Clear();

1
fechaRegreso.BlackoutDates.AddDatesInPast();

1
&#160;

1
<span style="color: #0000ff">if</span> (fechaSalida.SelectedDate &gt; fechaRegreso.SelectedDate)

1
{

1
fechaRegreso.SelectedDate = <span style="color: #0000ff">null</span>;

1
}

1
&#160;

1
<span style="color: #0000ff">if</span> (fechaSalida.SelectedDate == DateTime.Today)

1
{

1
<span style="color: #008000">//No hacemos nada</span>

1
}

1
<span style="color: #0000ff">else</span> <span style="color: #008000">//Evitamos que la fecha de regreso pueda ser menor a la de salida</span>

1
{

1
<span style="color: #008000">//Agregamos las necesarias</span>

1
DateTime fechaSalidaActual = fechaSalida.SelectedDate.GetValueOrDefault();

1
CalendarDateRange rangoBlackout =

1
<span style="color: #0000ff">new</span> CalendarDateRange(DateTime.Today, fechaSalidaActual.AddDays(-1));

1
fechaRegreso.BlackoutDates.Add(rangoBlackout);

1
}

1
}

El siguiente paso es lidiar con fechas no válidas. Debido a que el usuario puede escribir cualquier cosa en el campo de texto, hay probabilidades de que la fecha escrita no pueda ser interpretada como fecha y por tanto debemos lidiar con ello. Agregamos los delegados de la siguiente manera:

1
fechaSalida.DateValidationError +=

1
<span style="color: #0000ff">new</span> EventHandler&lt;DatePickerDateValidationErrorEventArgs&gt;(fecha_DateValidationError);

1
fechaRegreso.DateValidationError +=

1
<span style="color: #0000ff">new</span> EventHandler&lt;DatePickerDateValidationErrorEventArgs&gt;(fecha_DateValidationError);

Y lidiamos con errores así:

1
<span style="color: #0000ff">void</span> fecha_DateValidationError(<span style="color: #0000ff">object</span> sender, DatePickerDateValidationErrorEventArgs e)

1
{

1
DatePicker pick = (DatePicker)sender;

1
<span style="color: #0000ff">if</span> (pick == fechaSalida)

1
{

1
textoErrorSalida.Text = <span style="color: #006080">&quot;La fecha no es ¡lida&quot;</span>;

1
}

1
<span style="color: #0000ff">else</span>

1
{

1
textoErrorRegreso.Text = <span style="color: #006080">&quot;La fecha no es ¡lida&quot;</span>;

1
}

1
}

Finalmente, lidiamos con otros detalles como el evento del botón, limpiar errores, etcétera. El resultado final pueden verlo aquí y puden bajarse la solución aquí.

Dudas y comentarios, no duden en contactarme.

¡Saludos!