diff --git a/src/Compatibility/Core/src/Android/Renderers/DatePickerRenderer.cs b/src/Compatibility/Core/src/Android/Renderers/DatePickerRenderer.cs index 2c6a6526ddd0..43eb5f0d63d3 100644 --- a/src/Compatibility/Core/src/Android/Renderers/DatePickerRenderer.cs +++ b/src/Compatibility/Core/src/Android/Renderers/DatePickerRenderer.cs @@ -136,7 +136,11 @@ void IPickerRenderer.OnClick() DatePicker view = Element; ((IElementController)view).SetValueFromRenderer(VisualElement.IsFocusedPropertyKey, true); - ShowPickerDialog(view.Date.Year, view.Date.Month - 1, view.Date.Day); + var year = view.Date?.Year ?? DateTime.Today.Year; + var month = (view.Date?.Month ?? DateTime.Today.Month) - 1; + var day = view.Date?.Day ?? DateTime.Today.Day; + + ShowPickerDialog(year, month, day); } void ShowPickerDialog(int year, int month, int day) @@ -164,19 +168,19 @@ void OnCancelButtonClicked(object sender, EventArgs e) Element.Unfocus(); } - void SetDate(DateTime date) + void SetDate(DateTime? date) { if (String.IsNullOrWhiteSpace(Element.Format)) { - EditText.Text = date.ToShortDateString(); + EditText.Text = date?.ToShortDateString(); } else if (Element.Format.Contains('/', StringComparison.Ordinal)) { - EditText.Text = date.ToString(Element.Format, CultureInfo.InvariantCulture); + EditText.Text = date?.ToString(Element.Format, CultureInfo.InvariantCulture); } else { - EditText.Text = date.ToString(Element.Format); + EditText.Text = date?.ToString(Element.Format); } } @@ -198,7 +202,16 @@ void UpdateMaximumDate() { if (_dialog != null) { - _dialog.DatePicker.MaxDate = (long)Element.MaximumDate.ToUniversalTime().Subtract(DateTime.MinValue.AddYears(1969)).TotalMilliseconds; + if (Element.MaximumDate is null) + { + _dialog.DatePicker.MaxDate = (long)DateTime.MaxValue.ToUniversalTime() + .Subtract(DateTime.MinValue.AddYears(1969)).TotalMilliseconds; + + return; + } + + _dialog.DatePicker.MaxDate = (long)Element.MaximumDate.Value + .ToUniversalTime().Subtract(DateTime.MinValue.AddYears(1969)).TotalMilliseconds; } } @@ -207,7 +220,16 @@ void UpdateMinimumDate() { if (_dialog != null) { - _dialog.DatePicker.MinDate = (long)Element.MinimumDate.ToUniversalTime().Subtract(DateTime.MinValue.AddYears(1969)).TotalMilliseconds; + if (Element.MinimumDate is null) + { + _dialog.DatePicker.MinDate = (long)DateTime.MinValue.ToUniversalTime() + .Subtract(DateTime.MinValue.AddYears(1969)).TotalMilliseconds; + + return; + } + + _dialog.DatePicker.MinDate = (long)Element.MinimumDate.Value + .ToUniversalTime().Subtract(DateTime.MinValue.AddYears(1969)).TotalMilliseconds; } } diff --git a/src/Compatibility/Core/src/Windows/DatePickerRenderer.cs b/src/Compatibility/Core/src/Windows/DatePickerRenderer.cs index 77b7f04b7b0d..1164c66771d6 100644 --- a/src/Compatibility/Core/src/Windows/DatePickerRenderer.cs +++ b/src/Compatibility/Core/src/Windows/DatePickerRenderer.cs @@ -127,9 +127,9 @@ void OnControlDateChanged(object sender, DatePickerValueChangedEventArgs e) if (Element == null) return; - if (Element.Date.CompareTo(e.NewDate.Date) != 0) + if (Element.Date == null || Element.Date?.CompareTo(e.NewDate.Date) != 0) { - var date = e.NewDate.Date.Clamp(Element.MinimumDate, Element.MaximumDate); + var date = e.NewDate.Date.Clamp(Element.MinimumDate ?? DateTime.MinValue, Element.MaximumDate ?? DateTime.MaxValue); Element.Date = date; // set the control date-time to clamped value, if it exceeded the limits at the time of installation. @@ -148,10 +148,10 @@ bool CheckDateFormat() } [PortHandler] - void UpdateDate(DateTime date) + void UpdateDate(DateTime? date) { if (Control != null) - Control.Date = new DateTimeOffset(new DateTime(date.Ticks, DateTimeKind.Unspecified)); + Control.Date = new DateTimeOffset(new DateTime(date?.Ticks ?? 0, DateTimeKind.Unspecified)); UpdateDay(); UpdateMonth(); @@ -288,18 +288,18 @@ void UpdateFont() void UpdateMaximumDate() { if (Element != null && Control != null) - Control.MaxYear = new DateTimeOffset(new DateTime(Element.MaximumDate.Ticks, DateTimeKind.Unspecified)); + Control.MaxYear = new DateTimeOffset(new DateTime(Element.MaximumDate?.Ticks ?? DateTime.MaxValue.Ticks, DateTimeKind.Unspecified)); } [PortHandler] void UpdateMinimumDate() { - DateTime mindate = Element.MinimumDate; + DateTime mindate = Element.MinimumDate ?? DateTime.MinValue; try { if (Element != null && Control != null) - Control.MinYear = new DateTimeOffset(new DateTime(Element.MinimumDate.Ticks, DateTimeKind.Unspecified)); + Control.MinYear = new DateTimeOffset(new DateTime(Element.MinimumDate?.Ticks ?? DateTime.MinValue.Ticks, DateTimeKind.Unspecified)); } catch (ArgumentOutOfRangeException) { diff --git a/src/Compatibility/Core/src/iOS/Renderers/DatePickerRenderer.cs b/src/Compatibility/Core/src/iOS/Renderers/DatePickerRenderer.cs index 4e8cf6d1bdfa..e97fc197f131 100644 --- a/src/Compatibility/Core/src/iOS/Renderers/DatePickerRenderer.cs +++ b/src/Compatibility/Core/src/iOS/Renderers/DatePickerRenderer.cs @@ -176,8 +176,8 @@ void OnStarted(object sender, EventArgs eventArgs) [PortHandler] void UpdateDateFromModel(bool animate) { - if (_picker.Date.ToDateTime().Date != Element.Date.Date) - _picker.SetDate(Element.Date.ToNSDate(), animate); + if (_picker.Date.ToDateTime().Date != Element.Date?.Date) + _picker.SetDate(Element.Date?.ToNSDate(), animate); // Can't use Element.Format because it won't display the correct format if the region and language are set differently if (string.IsNullOrWhiteSpace(Element.Format) || Element.Format.Equals("d", StringComparison.OrdinalIgnoreCase)) @@ -200,11 +200,11 @@ void UpdateDateFromModel(bool animate) } else if (Element.Format.Contains('/', StringComparison.Ordinal)) { - Control.Text = Element.Date.ToString(Element.Format, CultureInfo.InvariantCulture); + Control.Text = Element.Date?.ToString(Element.Format, CultureInfo.InvariantCulture); } else { - Control.Text = Element.Date.ToString(Element.Format); + Control.Text = Element.Date?.ToString(Element.Format); } } @@ -237,13 +237,13 @@ void UpdateCharacterSpacing() [PortHandler] void UpdateMaximumDate() { - _picker.MaximumDate = Element.MaximumDate.ToNSDate(); + _picker.MaximumDate = Element.MaximumDate?.ToNSDate(); } [PortHandler] void UpdateMinimumDate() { - _picker.MinimumDate = Element.MinimumDate.ToNSDate(); + _picker.MinimumDate = Element.MinimumDate?.ToNSDate(); } [PortHandler] diff --git a/src/Controls/docs/Microsoft.Maui.Controls/DateChangedEventArgs.xml b/src/Controls/docs/Microsoft.Maui.Controls/DateChangedEventArgs.xml deleted file mode 100644 index 43d07adf02c0..000000000000 --- a/src/Controls/docs/Microsoft.Maui.Controls/DateChangedEventArgs.xml +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - Microsoft.Maui.Controls.Core - 0.0.0.0 - 1.0.0.0 - 1.1.0.0 - 1.2.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - - - System.EventArgs - - - - Event arguments for event. - - - - - - - - Constructor - - 0.0.0.0 - 1.0.0.0 - 1.1.0.0 - 1.2.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - - - - - The old date. - The new date. - Creates a new object that represents a change from to . - - - - - - - - Property - - 0.0.0.0 - 1.0.0.0 - 1.1.0.0 - 1.2.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - System.DateTime - - - The date that the user entered. - - - - - - - - Property - - 0.0.0.0 - 1.0.0.0 - 1.1.0.0 - 1.2.0.0 - 1.3.0.0 - 1.4.0.0 - 1.5.0.0 - 2.0.0.0 - Microsoft.Maui.Controls.Core - - - System.DateTime - - - The date that was on the element at the time that the user selected it. - - - - diff --git a/src/Controls/samples/Controls.Sample/Pages/Controls/DatePickerPage.xaml b/src/Controls/samples/Controls.Sample/Pages/Controls/DatePickerPage.xaml index d90848035ec2..cc78cae0c9af 100644 --- a/src/Controls/samples/Controls.Sample/Pages/Controls/DatePickerPage.xaml +++ b/src/Controls/samples/Controls.Sample/Pages/Controls/DatePickerPage.xaml @@ -89,6 +89,14 @@ Margin="6, 0" Style="{StaticResource IsFocusedTextStyle}"/> - +