允许排序

This commit is contained in:
ShaoHua
2026-01-01 02:48:58 +08:00
parent 03da513632
commit 8beb6b7a1e
5 changed files with 113 additions and 16 deletions
+47 -11
View File
@@ -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<TodoItem> 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]