From 8beb6b7a1e9d42443ebb06c1846303397419ae5c Mon Sep 17 00:00:00 2001 From: ShaoHua <345265198@qqcom> Date: Thu, 1 Jan 2026 02:48:58 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=81=E8=AE=B8=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TodoList/Models/TodoItem.cs | 21 ++++++++++ TodoList/TodoList.csproj | 5 ++- TodoList/ViewModels/MainViewModel.cs | 58 ++++++++++++++++++++++------ TodoList/Views/MainWindow.xaml | 43 +++++++++++++++++++-- TodoList/setup.iss | 2 +- 5 files changed, 113 insertions(+), 16 deletions(-) diff --git a/TodoList/Models/TodoItem.cs b/TodoList/Models/TodoItem.cs index 68eb565..49f0607 100644 --- a/TodoList/Models/TodoItem.cs +++ b/TodoList/Models/TodoItem.cs @@ -22,6 +22,24 @@ namespace TodoList.Models Failed } + public enum SortBy + { + [Description("创建时间")] + CreatedAt, + [Description("完成时间")] + CompletedAt, + [Description("优先级")] + Priority + } + + public enum SortOrder + { + [Description("升序")] + Ascending, + [Description("降序")] + Descending + } + public partial class TodoItem : ObservableObject { [ObservableProperty] @@ -40,6 +58,9 @@ namespace TodoList.Models [ObservableProperty] private DateTime createdAt = DateTime.Now; + [ObservableProperty] + private DateTime? completedAt; + [ObservableProperty] private SyncStatus syncStatus = SyncStatus.Pending; } diff --git a/TodoList/TodoList.csproj b/TodoList/TodoList.csproj index 37cc11f..eac4167 100644 --- a/TodoList/TodoList.csproj +++ b/TodoList/TodoList.csproj @@ -8,7 +8,7 @@ true true icon.ico - 1.0.18 + 1.0.21 @@ -38,4 +38,7 @@ + + + diff --git a/TodoList/ViewModels/MainViewModel.cs b/TodoList/ViewModels/MainViewModel.cs index 92fe59d..e102e9c 100644 --- a/TodoList/ViewModels/MainViewModel.cs +++ b/TodoList/ViewModels/MainViewModel.cs @@ -37,6 +37,12 @@ namespace TodoList.ViewModels [NotifyPropertyChangedFor(nameof(FullShortcut))] private string shortcutModifiers; + [ObservableProperty] + private SortBy sortBy = SortBy.Priority; + + [ObservableProperty] + private Models.SortOrder sortOrder = Models.SortOrder.Descending; + public string AppVersion => System.Reflection.Assembly.GetExecutingAssembly().GetName().Version?.ToString() ?? "1.0.0"; public string FullShortcut @@ -90,6 +96,16 @@ namespace TodoList.ViewModels await LoadTasksAsync(); } + async partial void OnSortByChanged(SortBy value) + { + await LoadTasksAsync(); + } + + async partial void OnSortOrderChanged(Models.SortOrder value) + { + await LoadTasksAsync(); + } + [RelayCommand] private async Task AddTaskAsync() { @@ -118,12 +134,26 @@ namespace TodoList.ViewModels ? allTasks : allTasks.Where(t => !t.IsCompleted).ToList(); - // Sort: Uncompleted first, then by priority (High -> Low), then date - var sorted = filtered - .OrderBy(t => t.IsCompleted) - .ThenByDescending(t => t.Priority) - .ThenByDescending(t => t.CreatedAt) - .ToList(); + IOrderedEnumerable sorted; + + if (SortBy == SortBy.Priority) + { + sorted = SortOrder == Models.SortOrder.Ascending + ? filtered.OrderBy(t => t.Priority).ThenBy(t => t.CreatedAt) + : filtered.OrderByDescending(t => t.Priority).ThenBy(t => t.CreatedAt); + } + else if (SortBy == SortBy.CreatedAt) + { + sorted = SortOrder == Models.SortOrder.Ascending + ? filtered.OrderBy(t => t.CreatedAt) + : filtered.OrderByDescending(t => t.CreatedAt); + } + else + { + sorted = SortOrder == Models.SortOrder.Ascending + ? filtered.OrderBy(t => t.CompletedAt).ThenBy(t => t.CreatedAt) + : filtered.OrderByDescending(t => t.CompletedAt).ThenBy(t => t.CreatedAt); + } Tasks.Clear(); foreach (var t in sorted) @@ -136,13 +166,19 @@ namespace TodoList.ViewModels private async Task ToggleCompleteAsync(TodoItem item) { if (item == null) return; - // item.IsCompleted is already toggled by UI binding before this command if TwoWay binding - // But usually CheckBox command parameter is the item. - // Let's assume the binding updates the property. - item.SyncStatus = SyncStatus.Pending; // Mark as pending sync + if (item.IsCompleted) + { + item.CompletedAt = DateTime.Now; + } + else + { + item.CompletedAt = null; + } + + item.SyncStatus = SyncStatus.Pending; await _dataService.SaveTaskAsync(item); - await LoadTasksAsync(); // Refresh list to apply filter + await LoadTasksAsync(); } [RelayCommand] diff --git a/TodoList/Views/MainWindow.xaml b/TodoList/Views/MainWindow.xaml index 134bb4e..015376c 100644 --- a/TodoList/Views/MainWindow.xaml +++ b/TodoList/Views/MainWindow.xaml @@ -22,6 +22,22 @@ + + + + + + + + + + + +