Browse Source

Merge pull request #7194 from timunie/fix/Issue_7162_CalendarPickerBindings

Update Calendar in CalendarDatePicker Popup properly
release/0.10.11
Max Katz 4 years ago
committed by Dan Walmsley
parent
commit
23e5aaa89a
  1. 68
      src/Avalonia.Controls/Calendar/CalendarDatePicker.cs
  2. 6
      src/Avalonia.Themes.Default/CalendarDatePicker.xaml
  3. 6
      src/Avalonia.Themes.Fluent/Controls/CalendarDatePicker.xaml
  4. 6
      tests/Avalonia.Controls.UnitTests/CalendarDatePickerTests.cs

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

@ -1,4 +1,4 @@
// (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.
@ -425,9 +425,6 @@ namespace Avalonia.Controls
{
FocusableProperty.OverrideDefaultValue<CalendarDatePicker>(true);
DisplayDateProperty.Changed.AddClassHandler<CalendarDatePicker>((x,e) => x.OnDisplayDateChanged(e));
DisplayDateStartProperty.Changed.AddClassHandler<CalendarDatePicker>((x,e) => x.OnDisplayDateStartChanged(e));
DisplayDateEndProperty.Changed.AddClassHandler<CalendarDatePicker>((x,e) => x.OnDisplayDateEndChanged(e));
IsDropDownOpenProperty.Changed.AddClassHandler<CalendarDatePicker>((x,e) => x.OnIsDropDownOpenChanged(e));
SelectedDateProperty.Changed.AddClassHandler<CalendarDatePicker>((x,e) => x.OnSelectedDateChanged(e));
SelectedDateFormatProperty.Changed.AddClassHandler<CalendarDatePicker>((x,e) => x.OnSelectedDateFormatChanged(e));
@ -459,18 +456,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;
@ -587,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;
@ -670,11 +609,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;

6
src/Avalonia.Themes.Default/CalendarDatePicker.xaml

@ -115,7 +115,11 @@
StaysOpen="False">
<Calendar Name="PART_Calendar"
FirstDayOfWeek="{TemplateBinding FirstDayOfWeek}"
IsTodayHighlighted="{TemplateBinding IsTodayHighlighted}"/>
IsTodayHighlighted="{TemplateBinding IsTodayHighlighted}"
SelectedDate="{TemplateBinding SelectedDate, Mode=TwoWay}"
DisplayDate="{TemplateBinding DisplayDate}"
DisplayDateStart="{TemplateBinding DisplayDateStart}"
DisplayDateEnd="{TemplateBinding DisplayDateEnd}" />
</Popup>
</Grid>
</ControlTemplate>

6
src/Avalonia.Themes.Fluent/Controls/CalendarDatePicker.xaml

@ -129,7 +129,11 @@
IsLightDismissEnabled="True">
<Calendar Name="PART_Calendar"
FirstDayOfWeek="{TemplateBinding FirstDayOfWeek}"
IsTodayHighlighted="{TemplateBinding IsTodayHighlighted}"/>
IsTodayHighlighted="{TemplateBinding IsTodayHighlighted}"
SelectedDate="{TemplateBinding SelectedDate, Mode=TwoWay}"
DisplayDate="{TemplateBinding DisplayDate}"
DisplayDateStart="{TemplateBinding DisplayDateStart}"
DisplayDateEnd="{TemplateBinding DisplayDateEnd}" />
</Popup>
</Grid>
</ControlTemplate>

6
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

Loading…
Cancel
Save