From f8f4b91d93a4b0545c9b2045913ada25991db9b1 Mon Sep 17 00:00:00 2001 From: Tim Date: Fri, 17 Dec 2021 20:10:56 +0100 Subject: [PATCH 1/3] Update Calendar in CalendarDatePicker Popup properly - Use `TemplateBinding` - Reflect changes of the blackout dates collection --- .../Calendar/CalendarDatePicker.cs | 63 ++++++++++++++----- .../CalendarDatePicker.xaml | 6 +- .../Controls/CalendarDatePicker.xaml | 6 +- 3 files changed, 58 insertions(+), 17 deletions(-) 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}" /> From f69e3e642efc67f431476370c024338b7d04f1b2 Mon Sep 17 00:00:00 2001 From: Tim U Date: Mon, 20 Dec 2021 09:52:14 +0100 Subject: [PATCH 2/3] Fix: BlackoutDates test was failing - Revert listen to colleciton changes as the collection is already synced - Setup the needed bindings in the test control --- .../Calendar/CalendarDatePicker.cs | 47 ------------------- .../CalendarDatePickerTests.cs | 6 ++- 2 files changed, 5 insertions(+), 48 deletions(-) diff --git a/src/Avalonia.Controls/Calendar/CalendarDatePicker.cs b/src/Avalonia.Controls/Calendar/CalendarDatePicker.cs index ced72651af..acfcfecdd8 100644 --- a/src/Avalonia.Controls/Calendar/CalendarDatePicker.cs +++ b/src/Avalonia.Controls/Calendar/CalendarDatePicker.cs @@ -5,7 +5,6 @@ using System; using System.Collections.ObjectModel; -using System.Collections.Specialized; using System.Diagnostics; using System.Globalization; using Avalonia.Controls.Primitives; @@ -441,7 +440,6 @@ namespace Avalonia.Controls FirstDayOfWeek = DateTimeHelper.GetCurrentDateFormat().FirstDayOfWeek; _defaultText = string.Empty; DisplayDate = DateTime.Today; - BlackoutDates.CollectionChanged += BlackoutDates_CollectionChanged; } protected override void OnApplyTemplate(TemplateAppliedEventArgs e) @@ -1188,50 +1186,5 @@ 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/tests/Avalonia.Controls.UnitTests/CalendarDatePickerTests.cs b/tests/Avalonia.Controls.UnitTests/CalendarDatePickerTests.cs index d77c7b87fa..a73e14939d 100644 --- a/tests/Avalonia.Controls.UnitTests/CalendarDatePickerTests.cs +++ b/tests/Avalonia.Controls.UnitTests/CalendarDatePickerTests.cs @@ -105,7 +105,11 @@ namespace Avalonia.Controls.UnitTests var calendar = new Calendar { - Name = "PART_Calendar" + Name = "PART_Calendar", + [!Calendar.SelectedDateProperty] = control[!CalendarDatePicker.SelectedDateProperty], + [!Calendar.DisplayDateProperty] = control[!CalendarDatePicker.DisplayDateProperty], + [!Calendar.DisplayDateStartProperty] = control[!CalendarDatePicker.DisplayDateStartProperty], + [!Calendar.DisplayDateEndProperty] = control[!CalendarDatePicker.DisplayDateEndProperty] }.RegisterInNameScope(scope); var popup = new Popup From e7286a8df87ca4ec1940bcd46f07dff926295aa2 Mon Sep 17 00:00:00 2001 From: Tim Date: Mon, 20 Dec 2021 19:57:13 +0100 Subject: [PATCH 3/3] Remove unused private voids --- .../Calendar/CalendarDatePicker.cs | 52 ------------------- 1 file changed, 52 deletions(-) diff --git a/src/Avalonia.Controls/Calendar/CalendarDatePicker.cs b/src/Avalonia.Controls/Calendar/CalendarDatePicker.cs index acfcfecdd8..a856ee071c 100644 --- a/src/Avalonia.Controls/Calendar/CalendarDatePicker.cs +++ b/src/Avalonia.Controls/Calendar/CalendarDatePicker.cs @@ -578,58 +578,6 @@ namespace Avalonia.Controls SetSelectedDate(); } - private void SetCalendarDisplayDate(DateTime value) - { - if (DateTimeHelper.CompareYearMonth(_calendar.DisplayDate, value) != 0) - { - _calendar.DisplayDate = DisplayDate; - if (DateTime.Compare(_calendar.DisplayDate, DisplayDate) != 0) - { - DisplayDate = _calendar.DisplayDate; - } - } - } - private void OnDisplayDateChanged(AvaloniaPropertyChangedEventArgs e) - { - if (_calendar != null) - { - var value = (DateTime)e.NewValue; - SetCalendarDisplayDate(value); - } - } - private void SetCalendarDisplayDateStart(DateTime? value) - { - _calendar.DisplayDateStart = value; - if (_calendar.DisplayDateStart.HasValue && DisplayDateStart.HasValue && DateTime.Compare(_calendar.DisplayDateStart.Value, DisplayDateStart.Value) != 0) - { - DisplayDateStart = _calendar.DisplayDateStart; - } - } - private void OnDisplayDateStartChanged(AvaloniaPropertyChangedEventArgs e) - { - if (_calendar != null) - { - var value = (DateTime?)e.NewValue; - SetCalendarDisplayDateStart(value); - } - } - private void SetCalendarDisplayDateEnd(DateTime? value) - { - _calendar.DisplayDateEnd = value; - if (_calendar.DisplayDateEnd.HasValue && DisplayDateEnd.HasValue && DateTime.Compare(_calendar.DisplayDateEnd.Value, DisplayDateEnd.Value) != 0) - { - DisplayDateEnd = _calendar.DisplayDateEnd; - } - - } - private void OnDisplayDateEndChanged(AvaloniaPropertyChangedEventArgs e) - { - if (_calendar != null) - { - var value = (DateTime?)e.NewValue; - SetCalendarDisplayDateEnd(value); - } - } private void OnIsDropDownOpenChanged(AvaloniaPropertyChangedEventArgs e) { var oldValue = (bool)e.OldValue;