Browse Source

Remove single-use methods and process within OnPropertyChanged

pull/7958/head
robloo 4 years ago
parent
commit
312edcbb4c
  1. 230
      src/Avalonia.Controls/Calendar/CalendarDatePicker.cs

230
src/Avalonia.Controls/Calendar/CalendarDatePicker.cs

@ -287,25 +287,124 @@ namespace Avalonia.Controls
/// <inheritdoc/>
protected override void OnPropertyChanged<T>(AvaloniaPropertyChangedEventArgs<T> 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<bool>();
var value = change.NewValue.GetValueOrDefault<bool>();
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();
}
}
/// <summary>
/// Raises the
/// <see cref="E:Avalonia.Controls.CalendarDatePicker.DateValidationError" />
@ -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;
}

Loading…
Cancel
Save