How to: Work with Date and Time Pickers
This guide covers DatePicker, TimePicker, CalendarDatePicker, and Calendar patterns: binding dates, formatting, validation, and date ranges.
DatePicker Basics
The DatePicker uses spinner controls for day, month, and year selection:
<DatePicker />
Setting an initial date
Date properties must be set in code (not XAML attributes) because there is no built-in string-to-DateTimeOffset converter:
myDatePicker.SelectedDate = new DateTimeOffset(new DateTime(2025, 6, 15));
Or bind to a view model property:
[ObservableProperty]
private DateTimeOffset? _birthDate;
<DatePicker SelectedDate="{Binding BirthDate}" />
Custom Date Formats
Control how each part of the date displays:
<!-- Show abbreviated day name -->
<DatePicker DayFormat="ddd dd" />
<!-- Show full month name -->
<DatePicker MonthFormat="MMMM" />
<!-- Four-digit year -->
<DatePicker YearFormat="yyyy" />
Common format strings:
| Format | Output example |
|---|---|
d | 5 |
dd | 05 |
ddd | Mon |
dddd | Monday |
M | 6 |
MM | 06 |
MMM | Jun |
MMMM | June |
yy | 25 |
yyyy | 2025 |
Hiding Date Parts
Show only the fields you need:
<!-- Month and year only (no day) -->
<DatePicker DayVisible="False" />
<!-- Year only -->
<DatePicker DayVisible="False" MonthVisible="False" />
TimePicker
The TimePicker provides hour and minute spinners:
<TimePicker />
12-hour vs 24-hour clock
<!-- 12-hour with AM/PM -->
<TimePicker ClockIdentifier="12HourClock" />
<!-- 24-hour -->
<TimePicker ClockIdentifier="24HourClock" />
Minute increments
<!-- 15-minute intervals -->
<TimePicker MinuteIncrement="15" />
Binding the selected time
[ObservableProperty]
private TimeSpan? _alarmTime;
<TimePicker SelectedTime="{Binding AlarmTime}" />
CalendarDatePicker
The CalendarDatePicker shows a text field that opens a full calendar dropdown:
<CalendarDatePicker PlaceholderText="Select a date"
SelectedDate="{Binding EventDate}" />
Display format
<CalendarDatePicker DisplayFormat="yyyy-MM-dd"
SelectedDate="{Binding EventDate}" />
Blackout dates
Disable specific dates from selection:
calendarDatePicker.BlackoutDates.Add(
new CalendarDateRange(DateTime.Today, DateTime.Today.AddDays(3)));
Calendar Control
The Calendar displays a full month view for inline date selection:
<Calendar SelectedDate="{Binding SelectedDate}"
SelectionMode="SingleDate" />
Selection modes
<!-- Single date -->
<Calendar SelectionMode="SingleDate" />
<!-- Range of dates -->
<Calendar SelectionMode="SingleRange" />
<!-- Multiple individual dates -->
<Calendar SelectionMode="MultipleRange" />
<!-- No selection (display only) -->
<Calendar SelectionMode="None" />
Display modes
<!-- Show month view (default) -->
<Calendar DisplayMode="Month" />
<!-- Start from year picker -->
<Calendar DisplayMode="Year" />
<!-- Start from decade picker -->
<Calendar DisplayMode="Decade" />
Date range limits
Restrict the navigable date range:
<Calendar DisplayDateStart="2025-01-01"
DisplayDateEnd="2025-12-31" />
Blackout dates in code
// Block weekends
for (var date = startDate; date <= endDate; date = date.AddDays(1))
{
if (date.DayOfWeek is DayOfWeek.Saturday or DayOfWeek.Sunday)
calendar.BlackoutDates.Add(new CalendarDateRange(date));
}
Date Validation
Validate that a selected date is within an acceptable range:
public partial class BookingViewModel : ObservableValidator
{
[ObservableProperty]
[NotifyDataErrorInfo]
[CustomValidation(typeof(BookingViewModel), nameof(ValidateFutureDate))]
private DateTimeOffset? _departureDate;
public static ValidationResult? ValidateFutureDate(DateTimeOffset? date, ValidationContext context)
{
if (date.HasValue && date.Value.Date <= DateTimeOffset.Now.Date)
return new ValidationResult("Departure date must be in the future.");
return ValidationResult.Success;
}
}
Date Formatting in Display
Show the selected date formatted in a TextBlock:
<StackPanel Spacing="8">
<DatePicker SelectedDate="{Binding SelectedDate}" />
<TextBlock Text="{Binding SelectedDate, StringFormat='Selected: {0:d}'}" />
</StackPanel>
Combining Date and Time
Use both pickers together for a complete datetime:
<StackPanel Orientation="Horizontal" Spacing="12">
<DatePicker SelectedDate="{Binding EventDate}" />
<TimePicker SelectedTime="{Binding EventTime}" ClockIdentifier="24HourClock" />
</StackPanel>
Combine them in the view model:
public DateTime? CombinedDateTime
{
get
{
if (EventDate is null) return null;
var date = EventDate.Value.Date;
return EventTime.HasValue
? date.Add(EventTime.Value)
: date;
}
}
Key Properties Reference
DatePicker
| Property | Type | Description |
|---|---|---|
SelectedDate | DateTimeOffset? | The selected date. |
DayVisible | bool | Show/hide the day spinner. |
MonthVisible | bool | Show/hide the month spinner. |
YearVisible | bool | Show/hide the year spinner. |
DayFormat | string | Format for the day display. |
MonthFormat | string | Format for the month display. |
YearFormat | string | Format for the year display. |
TimePicker
| Property | Type | Description |
|---|---|---|
SelectedTime | TimeSpan? | The selected time. |
ClockIdentifier | string | "12HourClock" or "24HourClock". |
MinuteIncrement | int | Step size for the minute spinner. |
See Also
- DatePicker Control Reference: Property tables.
- TimePicker Control Reference: Time selection control.
- Calendar Control Reference: Full calendar display.
- Data Validation: Validating bound values.