From 18488ce0569542b0f985e276f580a2d130b40b0f Mon Sep 17 00:00:00 2001 From: rabbitism Date: Tue, 6 Aug 2024 14:22:11 +0800 Subject: [PATCH] fix: Fix DatePicker initialization issue. --- demo/Ursa.Demo/Pages/DatePickerDemo.axaml | 6 +++ .../ViewModels/DatePickerDemoViewModel.cs | 28 ++++++++++++-- .../Controls/DateTimePicker/DatePicker.cs | 26 ++++++++----- .../DateTimePicker/DateRangePicker.cs | 38 +++++++++++++++++++ 4 files changed, 85 insertions(+), 13 deletions(-) diff --git a/demo/Ursa.Demo/Pages/DatePickerDemo.axaml b/demo/Ursa.Demo/Pages/DatePickerDemo.axaml index 0319ad6..c42e019 100644 --- a/demo/Ursa.Demo/Pages/DatePickerDemo.axaml +++ b/demo/Ursa.Demo/Pages/DatePickerDemo.axaml @@ -3,6 +3,8 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:u="https://irihi.tech/ursa" + xmlns:viewModels="clr-namespace:Ursa.Demo.ViewModels" + x:DataType="viewModels:DatePickerDemoViewModel" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Class="Ursa.Demo.Pages.DatePickerDemo"> @@ -10,5 +12,9 @@ + + + + diff --git a/demo/Ursa.Demo/ViewModels/DatePickerDemoViewModel.cs b/demo/Ursa.Demo/ViewModels/DatePickerDemoViewModel.cs index f77041c..693ab0f 100644 --- a/demo/Ursa.Demo/ViewModels/DatePickerDemoViewModel.cs +++ b/demo/Ursa.Demo/ViewModels/DatePickerDemoViewModel.cs @@ -1,6 +1,28 @@ -namespace Ursa.Demo.ViewModels; +using System; +using System.ComponentModel; +using CommunityToolkit.Mvvm.ComponentModel; -public class DatePickerDemoViewModel +namespace Ursa.Demo.ViewModels; + +public partial class DatePickerDemoViewModel: ObservableObject { - + [ObservableProperty] private DateTime? _selectedDate; + [ObservableProperty] private DateTime? _startDate; + [ObservableProperty] private DateTime? _endDate; + + public DatePickerDemoViewModel() + { + SelectedDate = DateTime.Today; + StartDate = DateTime.Today; + EndDate = DateTime.Today.AddDays(7); + } + + protected override void OnPropertyChanged(PropertyChangedEventArgs e) + { + base.OnPropertyChanged(e); + if (e.PropertyName == nameof(SelectedDate)) + { + + } + } } \ No newline at end of file diff --git a/src/Ursa/Controls/DateTimePicker/DatePicker.cs b/src/Ursa/Controls/DateTimePicker/DatePicker.cs index a239cc2..06a1296 100644 --- a/src/Ursa/Controls/DateTimePicker/DatePicker.cs +++ b/src/Ursa/Controls/DateTimePicker/DatePicker.cs @@ -52,16 +52,7 @@ public class DatePicker: DatePickerBase, IClearControl private void OnSelectionChanged(AvaloniaPropertyChangedEventArgs args) { - if (args.NewValue.Value is null) - { - _calendar?.ClearSelection(); - _textBox?.Clear(); - } - else - { - _calendar?.MarkDates(startDate: args.NewValue.Value, endDate: args.NewValue.Value); - _textBox?.SetValue(TextBox.TextProperty, args.NewValue.Value.Value.ToString(DisplayFormat ?? "yyyy-MM-dd")); - } + SyncSelectedDateToText(args.NewValue.Value); } protected override void OnApplyTemplate(TemplateAppliedEventArgs e) @@ -91,6 +82,7 @@ public class DatePicker: DatePickerBase, IClearControl { _calendar.DateSelected += OnDateSelected; } + SyncSelectedDateToText(SelectedDate); } private void OnDateSelected(object? sender, CalendarDayButtonEventArgs e) @@ -121,6 +113,20 @@ public class DatePicker: DatePickerBase, IClearControl { SetSelectedDate(true); } + + private void SyncSelectedDateToText(DateTime? date) + { + if (date is null) + { + _textBox?.SetValue(TextBox.TextProperty, null); + _calendar?.ClearSelection(); + } + else + { + _textBox?.SetValue(TextBox.TextProperty, date.Value.ToString(DisplayFormat ?? "yyyy-MM-dd")); + _calendar?.MarkDates(startDate: date.Value, endDate: date.Value); + } + } private void SetSelectedDate(bool fromText = false) { diff --git a/src/Ursa/Controls/DateTimePicker/DateRangePicker.cs b/src/Ursa/Controls/DateTimePicker/DateRangePicker.cs index f469c8f..e444504 100644 --- a/src/Ursa/Controls/DateTimePicker/DateRangePicker.cs +++ b/src/Ursa/Controls/DateTimePicker/DateRangePicker.cs @@ -165,6 +165,42 @@ public class DateRangePicker : DatePickerBase, IClearControl _endCalendar.DatePreviewed += OnDatePreviewed; _endCalendar.ContextDateChanged += OnContextDateChanged; } + SyncDateToText(); + } + + private void SyncDateToText() + { + if (SelectedStartDate is not null) + { + _startTextBox?.SetValue(TextBox.TextProperty, SelectedStartDate.Value.ToString(DisplayFormat ?? "yyyy-MM-dd")); + } + if (SelectedEndDate is not null) + { + _endTextBox?.SetValue(TextBox.TextProperty, SelectedEndDate.Value.ToString(DisplayFormat ?? "yyyy-MM-dd")); + } + + if (SelectedStartDate is null) + { + _startCalendar?.ClearSelection(); + } + if(SelectedEndDate is null) + { + _endCalendar?.ClearSelection(); + } + if(SelectedStartDate is not null && SelectedEndDate is not null) + { + _startCalendar?.MarkDates(SelectedStartDate, SelectedEndDate); + _endCalendar?.MarkDates(SelectedStartDate, SelectedEndDate); + } + else if(SelectedStartDate is not null) + { + _startCalendar?.MarkDates(SelectedStartDate, SelectedStartDate); + } + else if(SelectedEndDate is not null) + { + _endCalendar?.MarkDates(SelectedEndDate, SelectedEndDate); + } + PseudoClasses.Set(PseudoClassName.PC_Empty, SelectedStartDate is null && SelectedEndDate is null); } private void OnTextBoxLostFocus(object? sender, RoutedEventArgs e) @@ -381,4 +417,6 @@ public class DateRangePicker : DatePickerBase, IClearControl SetCurrentValue(IsDropdownOpenProperty, true); } + + } \ No newline at end of file