/
makarenkova
/
c_sharp
Обзор
Документация
Войти
/
makarenkova
/
c_sharp
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
PlannerProject/Modules/Planner.Modules.Main/ViewModels/DatePickerDialogViewModel.cs
139 строк
5 KB
Makarenkova Vera
Небольшая доработка
17 май 2026, 12:12
17 май 2026, 12:12
ec9cf57
Код
Авторство
О чём код?
using Prism.Commands; using Prism.Mvvm; using Prism.Services.Dialogs; using System; using System.Globalization; namespace Planner.Modules.Main.ViewModels { public class DatePickerDialogViewModel : BindableBase, IDialogAware { // IDialogAware требует Title, RequestClose и CanCloseDialog public string Title => "Выбор даты и времени"; public event Action<IDialogResult> RequestClose; private string _dateString; public string DateString { get => _dateString; set { if (SetProperty(ref _dateString, value)) { // При изменении текста даты пытаемся распарсить и обновить SelectedDate if (TryParseDate(value, out DateTime parsedDate)) SelectedDate = parsedDate; } } } private DateTime? _selectedDate; public DateTime? SelectedDate { get => _selectedDate; set { if (SetProperty(ref _selectedDate, value)) { // При изменении выбранной даты обновляем текстовое представление if (value.HasValue) DateString = value.Value.ToString("dd.MM.yyyy"); // Закрываем popup календаря после выбора даты IsCalendarOpen = false; } } } private string _timeString; public string TimeString { get => _timeString; set => SetProperty(ref _timeString, value); } private bool _isCalendarOpen; public bool IsCalendarOpen { get => _isCalendarOpen; set => SetProperty(ref _isCalendarOpen, value); } public DelegateCommand OkCommand { get; } public DelegateCommand CancelCommand { get; } public DelegateCommand ToggleCalendarCommand { get; } public DatePickerDialogViewModel() { OkCommand = new DelegateCommand(OnOk); CancelCommand = new DelegateCommand(OnCancel); ToggleCalendarCommand = new DelegateCommand(() => IsCalendarOpen = !IsCalendarOpen); } // Prism вызывает этот метод перед показом диалога // Здесь принимаем начальную дату, переданную из TaskViewModel public void OnDialogOpened(IDialogParameters parameters) { var initialDate = parameters.GetValue<DateTime>("initialDate"); SelectedDate = initialDate; DateString = initialDate.ToString("dd.MM.yyyy"); TimeString = initialDate.ToString("HH:mm"); } public bool CanCloseDialog() => true; public void OnDialogClosed() { } private void OnOk() { if (!TryParseDate(DateString, out DateTime date)) { System.Windows.MessageBox.Show( "Неверный формат даты. Используйте дд.мм.гггг (например, 15.05.2026).", "Ошибка", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error); return; } if (!TryParseTime(TimeString, out TimeSpan time)) { System.Windows.MessageBox.Show( "Неверный формат времени. Используйте ЧЧ:мм (например, 14:30).", "Ошибка", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error); return; } // Передаём результат обратно вызывающей стороне var parameters = new DialogParameters { { "selectedDate", date.Date + time } }; var result = new DialogResult(ButtonResult.OK, parameters); RequestClose?.Invoke(result); } private void OnCancel() { RequestClose?.Invoke(new DialogResult(ButtonResult.Cancel)); } private static bool TryParseDate(string s, out DateTime date) { date = DateTime.MinValue; if (string.IsNullOrWhiteSpace(s)) return false; if (DateTime.TryParseExact(s, "dd.MM.yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out date)) return true; if (DateTime.TryParseExact(s, "d.M.yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out date)) return true; return DateTime.TryParse(s, out date); } private static bool TryParseTime(string s, out TimeSpan time) { time = TimeSpan.Zero; if (string.IsNullOrWhiteSpace(s)) return false; if (TimeSpan.TryParseExact(s, "hh\\:mm", CultureInfo.InvariantCulture, out time)) return true; if (TimeSpan.TryParseExact(s, "h\\:mm", CultureInfo.InvariantCulture, out time)) return true; return TimeSpan.TryParse(s, out time); } } }