Вот один способ сделать это, который требует небольших усилий:
Наследовать стили по умолчанию для Calendar и CalendarDayButton и внести некоторые небольшие изменения:
<local:DateIsInListConverter x:Key="DateIsInListConverter" />
<Style x:Key="CustomCalendarDayButtonStyle" TargetType="{x:Type CalendarDayButton}" BasedOn="{StaticResource {x:Type CalendarDayButton}}">
<Style.Triggers>
<DataTrigger Value="True">
<DataTrigger.Binding>
<MultiBinding Converter="{StaticResource DateIsInListConverter}">
<Binding />
<Binding ElementName="MyWindow" Path="HighlightedDates" />
</MultiBinding>
</DataTrigger.Binding>
<Setter Property="Background" Value="Orange" />
</DataTrigger>
</Style.Triggers>
</Style>
<Style x:Key="CustomCalendarStyle" TargetType="{x:Type Calendar}" BasedOn="{StaticResource {x:Type Calendar}}">
<Setter Property="CalendarDayButtonStyle" Value="{StaticResource CustomCalendarDayButtonStyle}" />
</Style>
Второе связывание в MultiBindingк вашему списку интересных дат, и вот реализация DateIsInListConverter:
public class DateIsInListConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values.Length < 2 || !(values[0] is DateTime) || !(values[1] is IEnumerable<DateTime>))
return false;
var date = (DateTime) values[0];
var dateList = (IEnumerable<DateTime>) values[1];
return dateList.Contains(date);
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
Теперь используйте CustomCalendarStyle для DatePicker, и все готово:
<DatePicker CalendarStyle="{StaticResource CustomCalendarStyle}" />
Для полного примера сМногоразовый HighlightDatePicker, посмотрите мой репозиторий GitHub: https://github.com/cmyksvoll/HighlightDatePicker