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 @@
+
+
+
+
+
+
+
+
+
+
+
+