diff --git a/src/Avalonia.Controls/Calendar/CalendarDatePicker.cs b/src/Avalonia.Controls/Calendar/CalendarDatePicker.cs index af3fdbd662..ced72651af 100644 --- a/src/Avalonia.Controls/Calendar/CalendarDatePicker.cs +++ b/src/Avalonia.Controls/Calendar/CalendarDatePicker.cs @@ -1,10 +1,11 @@ -// (c) Copyright Microsoft Corporation. +// (c) Copyright Microsoft Corporation. // This source is subject to the Microsoft Public License (Ms-PL). // Please see http://go.microsoft.com/fwlink/?LinkID=131993 for details. // All other rights reserved. using System; using System.Collections.ObjectModel; +using System.Collections.Specialized; using System.Diagnostics; using System.Globalization; using Avalonia.Controls.Primitives; @@ -425,9 +426,6 @@ namespace Avalonia.Controls { FocusableProperty.OverrideDefaultValue(true); - DisplayDateProperty.Changed.AddClassHandler((x,e) => x.OnDisplayDateChanged(e)); - DisplayDateStartProperty.Changed.AddClassHandler((x,e) => x.OnDisplayDateStartChanged(e)); - DisplayDateEndProperty.Changed.AddClassHandler((x,e) => x.OnDisplayDateEndChanged(e)); IsDropDownOpenProperty.Changed.AddClassHandler((x,e) => x.OnIsDropDownOpenChanged(e)); SelectedDateProperty.Changed.AddClassHandler((x,e) => x.OnSelectedDateChanged(e)); SelectedDateFormatProperty.Changed.AddClassHandler((x,e) => x.OnSelectedDateFormatChanged(e)); @@ -443,6 +441,7 @@ namespace Avalonia.Controls FirstDayOfWeek = DateTimeHelper.GetCurrentDateFormat().FirstDayOfWeek; _defaultText = string.Empty; DisplayDate = DateTime.Today; + BlackoutDates.CollectionChanged += BlackoutDates_CollectionChanged; } protected override void OnApplyTemplate(TemplateAppliedEventArgs e) @@ -459,18 +458,12 @@ namespace Avalonia.Controls if (_calendar != null) { _calendar.SelectionMode = CalendarSelectionMode.SingleDate; - _calendar.SelectedDate = SelectedDate; - SetCalendarDisplayDate(DisplayDate); - SetCalendarDisplayDateStart(DisplayDateStart); - SetCalendarDisplayDateEnd(DisplayDateEnd); _calendar.DayButtonMouseUp += Calendar_DayButtonMouseUp; _calendar.DisplayDateChanged += Calendar_DisplayDateChanged; _calendar.SelectedDatesChanged += Calendar_SelectedDatesChanged; _calendar.PointerReleased += Calendar_PointerReleased; _calendar.KeyDown += Calendar_KeyDown; - //_calendar.SizeChanged += new SizeChangedEventHandler(Calendar_SizeChanged); - //_calendar.IsTabStop = true; var currentBlackoutDays = BlackoutDates; BlackoutDates = _calendar.BlackoutDates; @@ -670,11 +663,6 @@ namespace Avalonia.Controls var addedDate = (DateTime?)e.NewValue; var removedDate = (DateTime?)e.OldValue; - if (_calendar != null && addedDate != _calendar.SelectedDate) - { - _calendar.SelectedDate = addedDate; - } - if (SelectedDate != null) { DateTime day = SelectedDate.Value; @@ -1200,5 +1188,50 @@ namespace Avalonia.Controls return newD; } } + + private void BlackoutDates_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) + { + switch (e.Action) + { + case NotifyCollectionChangedAction.Add: + foreach (CalendarDateRange item in e.NewItems) + { + _calendar.BlackoutDates.Add(item); + } + break; + + case NotifyCollectionChangedAction.Move: + // We do not need to handle this case as the result will not have an effect. + break; + case NotifyCollectionChangedAction.Remove: + foreach (CalendarDateRange item in e.OldItems) + { + _calendar.BlackoutDates.Remove(item); + } + break; + + case NotifyCollectionChangedAction.Replace: + foreach (CalendarDateRange item in e.OldItems) + { + _calendar.BlackoutDates.Remove(item); + } + foreach (CalendarDateRange item in e.NewItems) + { + _calendar.BlackoutDates.Add(item); + } + break; + + case NotifyCollectionChangedAction.Reset: + _calendar.BlackoutDates.Clear(); + foreach (CalendarDateRange item in BlackoutDates) + { + _calendar.BlackoutDates.Add(item); + } + break; + + default: + throw new ArgumentOutOfRangeException(nameof(e.Action), e.Action, "Invalid NotifyCollectionChangedAction"); + } + } } } diff --git a/src/Avalonia.Themes.Default/CalendarDatePicker.xaml b/src/Avalonia.Themes.Default/CalendarDatePicker.xaml index 57b77f70ea..3e2e497d2c 100644 --- a/src/Avalonia.Themes.Default/CalendarDatePicker.xaml +++ b/src/Avalonia.Themes.Default/CalendarDatePicker.xaml @@ -115,7 +115,11 @@ StaysOpen="False"> + IsTodayHighlighted="{TemplateBinding IsTodayHighlighted}" + SelectedDate="{TemplateBinding SelectedDate, Mode=TwoWay}" + DisplayDate="{TemplateBinding DisplayDate}" + DisplayDateStart="{TemplateBinding DisplayDateStart}" + DisplayDateEnd="{TemplateBinding DisplayDateEnd}" /> diff --git a/src/Avalonia.Themes.Fluent/Controls/CalendarDatePicker.xaml b/src/Avalonia.Themes.Fluent/Controls/CalendarDatePicker.xaml index 995cca2b82..6c4e94caf1 100644 --- a/src/Avalonia.Themes.Fluent/Controls/CalendarDatePicker.xaml +++ b/src/Avalonia.Themes.Fluent/Controls/CalendarDatePicker.xaml @@ -129,7 +129,11 @@ IsLightDismissEnabled="True"> + IsTodayHighlighted="{TemplateBinding IsTodayHighlighted}" + SelectedDate="{TemplateBinding SelectedDate, Mode=TwoWay}" + DisplayDate="{TemplateBinding DisplayDate}" + DisplayDateStart="{TemplateBinding DisplayDateStart}" + DisplayDateEnd="{TemplateBinding DisplayDateEnd}" />