/
makarenkova
/
c_sharp
Обзор
Документация
Войти
/
makarenkova
/
c_sharp
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
PlannerProject/Modules/Planner.Modules.Main/ViewModels/DayViewModel.cs
111 строк
4 KB
Makarenkova Vera
Исправлены комментарии
16 май 2026, 16:38
16 май 2026, 16:38
66b2bf6
Код
Авторство
О чём код?
using System; using System.Collections.ObjectModel; using System.Collections.Specialized; using System.ComponentModel; using System.Linq; using Prism.Mvvm; namespace Planner.Modules.Main.ViewModels { public class DayViewModel : BindableBase { private ObservableCollection<TaskViewModel> _tasks = new(); public DateTime Date { get; set; } public string DayName => Date.ToString("dddd"); public string DayNumber => Date.ToString("dd.MM"); public bool IsCurrentDay { get; set; } public bool IsWeekend => Date.DayOfWeek == DayOfWeek.Saturday || Date.DayOfWeek == DayOfWeek.Sunday; // ObservableCollection умеет уведомлять UI только о том, что список изменился — // задача добавлена или удалена. Но она не знает ничего о том, что происходит внутри каждого элемента. // Нужно отслеживать изменение IsCompleted у каждой задачи, // чтобы обновлять счётчик "{CompletedTasks}/{TotalTasks} выполнено". public ObservableCollection<TaskViewModel> Tasks { get => _tasks; set { if (_tasks != value) { if (_tasks != null) { _tasks.CollectionChanged -= Tasks_CollectionChanged; UnsubscribeFromTasks(_tasks); } _tasks = value; if (_tasks != null) { _tasks.CollectionChanged += Tasks_CollectionChanged; SubscribeToTasks(_tasks); } RaisePropertyChanged(); RaisePropertyChanged(nameof(HasTasks)); UpdateTaskCounts(); } } } public bool HasTasks => Tasks?.Count > 0; public int TotalTasks => Tasks?.Count ?? 0; public int CompletedTasks => Tasks?.Count(t => t.IsCompleted) ?? 0; public string TaskCounterDisplay => $"{CompletedTasks}/{TotalTasks} выполнено"; private void Tasks_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { if (e.OldItems != null) { foreach (TaskViewModel task in e.OldItems) { task.PropertyChanged -= Task_PropertyChanged; } } if (e.NewItems != null) { foreach (TaskViewModel task in e.NewItems) { task.PropertyChanged += Task_PropertyChanged; } } RaisePropertyChanged(nameof(HasTasks)); UpdateTaskCounts(); } private void Task_PropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName == nameof(TaskViewModel.IsCompleted)) { UpdateTaskCounts(); } } private void SubscribeToTasks(ObservableCollection<TaskViewModel> tasks) { foreach (var task in tasks) { task.PropertyChanged += Task_PropertyChanged; } } private void UnsubscribeFromTasks(ObservableCollection<TaskViewModel> tasks) { foreach (var task in tasks) { task.PropertyChanged -= Task_PropertyChanged; } } private void UpdateTaskCounts() { RaisePropertyChanged(nameof(TotalTasks)); RaisePropertyChanged(nameof(CompletedTasks)); RaisePropertyChanged(nameof(TaskCounterDisplay)); } } }