diff --git a/src/Avalonia.Controls/Calendar/CalendarDatePicker.cs b/src/Avalonia.Controls/Calendar/CalendarDatePicker.cs index 8551205b78..9e703b40a9 100644 --- a/src/Avalonia.Controls/Calendar/CalendarDatePicker.cs +++ b/src/Avalonia.Controls/Calendar/CalendarDatePicker.cs @@ -287,25 +287,124 @@ namespace Avalonia.Controls /// protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) { + // CustomDateFormatString if (change.Property == CustomDateFormatStringProperty) { - OnCustomDateFormatStringChanged(change); + if (SelectedDateFormat == CalendarDatePickerFormat.Custom) + { + OnDateFormatChanged(); + } } + // IsDropDownOpen else if (change.Property == IsDropDownOpenProperty) { - OnIsDropDownOpenChanged(change); + var oldValue = change.OldValue.GetValueOrDefault(); + var value = change.NewValue.GetValueOrDefault(); + + if (_popUp != null && _popUp.Child != null) + { + if (value != oldValue) + { + if (_calendar!.DisplayMode != CalendarMode.Month) + { + _calendar.DisplayMode = CalendarMode.Month; + } + + if (value) + { + OpenDropDown(); + } + else + { + _popUp.IsOpen = false; + OnCalendarClosed(new RoutedEventArgs()); + } + } + } } + // SelectedDate else if (change.Property == SelectedDateProperty) { - OnSelectedDateChanged(change); + var addedDate = change.NewValue.GetValueOrDefault() as DateTime?; + var removedDate = change.OldValue.GetValueOrDefault() as DateTime?; + + if (SelectedDate != null) + { + DateTime day = SelectedDate.Value; + + // When the SelectedDateProperty change is done from + // OnTextPropertyChanged method, two-way binding breaks if + // BeginInvoke is not used: + Threading.Dispatcher.UIThread.InvokeAsync(() => + { + _settingSelectedDate = true; + Text = DateTimeToString(day); + _settingSelectedDate = false; + OnDateSelected(addedDate, removedDate); + }); + + // When DatePickerDisplayDateFlag is TRUE, the SelectedDate + // change is coming from the Calendar UI itself, so, we + // shouldn't change the DisplayDate since it will automatically + // be changed by the Calendar + if ((day.Month != DisplayDate.Month || day.Year != DisplayDate.Year) && (_calendar == null || !_calendar.CalendarDatePickerDisplayDateFlag)) + { + DisplayDate = day; + } + if(_calendar != null) + _calendar.CalendarDatePickerDisplayDateFlag = false; + } + else + { + _settingSelectedDate = true; + SetWaterMarkText(); + _settingSelectedDate = false; + OnDateSelected(addedDate, removedDate); + } } + // SelectedDateFormat else if (change.Property == SelectedDateFormatProperty) { - OnSelectedDateFormatChanged(change); + OnDateFormatChanged(); } + // Text else if (change.Property == TextProperty) { - OnTextChanged(change); + var oldValue = change.OldValue.GetValueOrDefault() as string; + var value = change.NewValue.GetValueOrDefault() as string; + + if (!_suspendTextChangeHandler) + { + if (value != null) + { + if (_textBox != null) + { + _textBox.Text = value; + } + else + { + _defaultText = value; + } + + if (!_settingSelectedDate) + { + SetSelectedDate(); + } + } + else + { + if (!_settingSelectedDate) + { + _settingSelectedDate = true; + SelectedDate = null; + _settingSelectedDate = false; + } + } + } + else + { + SetWaterMarkText(); + } } base.OnPropertyChanged(change); @@ -355,73 +454,6 @@ namespace Avalonia.Controls SetSelectedDate(); } - - private void OnIsDropDownOpenChanged(AvaloniaPropertyChangedEventArgs e) - { - var oldValue = (bool)e.OldValue!; - var value = (bool)e.NewValue!; - - if (_popUp != null && _popUp.Child != null) - { - if (value != oldValue) - { - if (_calendar!.DisplayMode != CalendarMode.Month) - { - _calendar.DisplayMode = CalendarMode.Month; - } - - if (value) - { - OpenDropDown(); - } - else - { - _popUp.IsOpen = false; - OnCalendarClosed(new RoutedEventArgs()); - } - } - } - } - - private void OnSelectedDateChanged(AvaloniaPropertyChangedEventArgs e) - { - var addedDate = (DateTime?)e.NewValue; - var removedDate = (DateTime?)e.OldValue; - - if (SelectedDate != null) - { - DateTime day = SelectedDate.Value; - - // When the SelectedDateProperty change is done from - // OnTextPropertyChanged method, two-way binding breaks if - // BeginInvoke is not used: - Threading.Dispatcher.UIThread.InvokeAsync(() => - { - _settingSelectedDate = true; - Text = DateTimeToString(day); - _settingSelectedDate = false; - OnDateSelected(addedDate, removedDate); - }); - - // When DatePickerDisplayDateFlag is TRUE, the SelectedDate - // change is coming from the Calendar UI itself, so, we - // shouldn't change the DisplayDate since it will automatically - // be changed by the Calendar - if ((day.Month != DisplayDate.Month || day.Year != DisplayDate.Year) && (_calendar == null || !_calendar.CalendarDatePickerDisplayDateFlag)) - { - DisplayDate = day; - } - if(_calendar != null) - _calendar.CalendarDatePickerDisplayDateFlag = false; - } - else - { - _settingSelectedDate = true; - SetWaterMarkText(); - _settingSelectedDate = false; - OnDateSelected(addedDate, removedDate); - } - } private void OnDateFormatChanged() { @@ -448,57 +480,6 @@ namespace Avalonia.Controls } } - private void OnSelectedDateFormatChanged(AvaloniaPropertyChangedEventArgs e) - { - OnDateFormatChanged(); - } - - private void OnCustomDateFormatStringChanged(AvaloniaPropertyChangedEventArgs e) - { - if(SelectedDateFormat == CalendarDatePickerFormat.Custom) - { - OnDateFormatChanged(); - } - } - - private void OnTextChanged(AvaloniaPropertyChangedEventArgs e) - { - var oldValue = (string?)e.OldValue; - var value = (string?)e.NewValue; - - if (!_suspendTextChangeHandler) - { - if (value != null) - { - if (_textBox != null) - { - _textBox.Text = value; - } - else - { - _defaultText = value; - } - if (!_settingSelectedDate) - { - SetSelectedDate(); - } - } - else - { - if (!_settingSelectedDate) - { - _settingSelectedDate = true; - SelectedDate = null; - _settingSelectedDate = false; - } - } - } - else - { - SetWaterMarkText(); - } - } - /// /// Raises the /// @@ -737,6 +718,7 @@ namespace Avalonia.Controls throw textParseError.Exception; } } + return null; } @@ -753,6 +735,7 @@ namespace Avalonia.Controls case CalendarDatePickerFormat.Custom: return string.Format(CultureInfo.CurrentCulture, d.ToString(CustomDateFormatString, dtfi)); } + return null; } @@ -776,6 +759,7 @@ namespace Avalonia.Controls break; } } + return false; }