/
makarenkova
/
c_sharp
Обзор
Документация
Войти
/
makarenkova
/
c_sharp
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
PlannerProject/Modules/Planner.Modules.Main/ViewModels/TaskViewModel.cs
228 строк
8 KB
Makarenkova Vera
Исправлены комментарии
16 май 2026, 16:38
16 май 2026, 16:38
66b2bf6
Код
Авторство
О чём код?
using Planner.Modules.Main.Events; using Planner.Modules.Main.Models; using Planner.Modules.Main.Services; using Planner.Shared; using Prism.Commands; using Prism.Events; using Prism.Mvvm; using Prism.Services.Dialogs; using System; using System.Collections.ObjectModel; using System.Windows; using Planner.Modules.Main.Views; namespace Planner.Modules.Main.ViewModels { public class TaskViewModel : BindableBase { private readonly TaskItem _taskItem; private readonly IDBService _taskService; private readonly IEventAggregator _eventAggregator; private readonly IDialogService _dialogService; private bool _isInEditMode; private string _tempTitle; private string _tempDescription; private Priority _tempPriority; private DateTime _tempDate; private TimeSpan _tempTime; private bool _tempIsCompleted; public DelegateCommand SaveCommand { get; private set; } public DelegateCommand DeleteCommand { get; private set; } public DelegateCommand ChangeDateCommand { get; private set; } // Список элементов перечисления Priority public ObservableCollection<PriorityItem> PriorityLevels { get; } // Сложность public Priority Priority { get => _taskItem.Priority; set { _taskItem.Priority = value; RaisePropertyChanged(); } } public string Title { get => _taskItem.Title; set { _taskItem.Title = value; RaisePropertyChanged(); SaveCommand.RaiseCanExecuteChanged(); } } public string Description { get => _taskItem.Description; set { _taskItem.Description = value; RaisePropertyChanged(); } } public bool IsCompleted { get => _taskItem.IsCompleted; set { _taskItem.IsCompleted = value; RaisePropertyChanged(); } } // Дата (без времени) public DateTime Date { get => _taskItem.Date.Date; set { // Сохраняем текущее время при изменении даты var currentTime = _taskItem.Date.TimeOfDay; _taskItem.Date = value.Date + currentTime; RaisePropertyChanged(); RaisePropertyChanged(nameof(Time)); // Обновляем отображение времени RaisePropertyChanged(nameof(DisplayDateTime)); // Обновляем отображение полной даты-времени } } // Время public TimeSpan Time { get => _taskItem.Date.TimeOfDay; set { // Сохраняем текущую дату при изменении времени var currentDate = _taskItem.Date.Date; _taskItem.Date = currentDate + value; RaisePropertyChanged(); RaisePropertyChanged(nameof(Date)); // Обновляем отображение даты RaisePropertyChanged(nameof(DisplayDateTime)); // Обновляем отображение полной даты-времени } } // Полная дата и время для отображения public DateTime DisplayDateTime => _taskItem.Date; private bool CanSaveEdit() { return !string.IsNullOrWhiteSpace(Title); } public bool IsInEditMode { get => _isInEditMode; set => SetProperty(ref _isInEditMode, value); } public TaskViewModel(TaskItem taskItem, IDBService taskService, IEventAggregator eventAggregator, IDialogService dialogService) { _taskService = taskService; _eventAggregator = eventAggregator; _dialogService = dialogService; _taskItem = taskItem; PriorityLevels = new ObservableCollection<PriorityItem>( PriorityHelper.GetPriorityItems() ); SaveCommand = new DelegateCommand(SaveEdit, CanSaveEdit); DeleteCommand = new DelegateCommand(DeleteEdit); ChangeDateCommand = new DelegateCommand(ChangeDate); } public void BeginEdit() { _tempTitle = Title; _tempDescription = Description; _tempPriority = Priority; _tempDate = Date; _tempTime = Time; _tempIsCompleted = IsCompleted; IsInEditMode = true; SaveCommand.RaiseCanExecuteChanged(); } public void SaveEdit() { // Проверяем, изменились ли данные bool hasChanges = _tempTitle != Title || _tempDescription != Description || _tempPriority != Priority || _tempDate != Date || _tempTime != Time || _tempIsCompleted != IsCompleted; if (hasChanges) { _taskService.UpdateTask(_taskItem); _eventAggregator.GetEvent<TaskUpdatedEvent>().Publish(_taskItem); } IsInEditMode = false; } public void DeleteEdit() { _taskService.DeleteTask(_taskItem.Id); IsInEditMode = false; _eventAggregator.GetEvent<TaskDeletedEvent>().Publish(_taskItem); } public void ExitEditMode() { if (IsInEditMode) { Title = _tempTitle; Description = _tempDescription; Priority = _tempPriority; Date = _tempDate; Time = _tempTime; IsCompleted = _tempIsCompleted; IsInEditMode = false; } } // Изменение даты задачи через диалог выбора даты private void ChangeDate() { // Запрещаем изменение даты у выполненных задач if (IsCompleted) { MessageBox.Show("Нельзя изменить дату у выполненной задачи.", "Предупреждение", MessageBoxButton.OK, MessageBoxImage.Warning); return; } var parameters = new DialogParameters { { "initialDate", _taskItem.Date } }; _dialogService.ShowDialog(nameof(DatePickerDialog), parameters, result => { if (result.Result != ButtonResult.OK) return; var newDateTime = result.Parameters.GetValue<DateTime>("selectedDate"); if (newDateTime.Date < DateTime.Today) { var warn = MessageBox.Show( $"Выбранная дата ({newDateTime:dd.MM.yyyy}) следует раньше текущей. Продолжить?", "Предупреждение", MessageBoxButton.YesNo, MessageBoxImage.Warning); if (warn != MessageBoxResult.Yes) return; } _taskItem.Date = newDateTime; _taskService.UpdateTask(_taskItem); _eventAggregator.GetEvent<TaskChangedEvent>().Publish(_taskItem); }); } public TaskItem GetModel() => _taskItem; } }