允许排序

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

View File

@@ -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;
}

View File

@@ -8,7 +8,7 @@
<UseWPF>true</UseWPF>
<UseWindowsForms>true</UseWindowsForms>
<ApplicationIcon>icon.ico</ApplicationIcon>
<Version>1.0.18</Version>
<Version>1.0.21</Version>
</PropertyGroup>
<ItemGroup>
@@ -38,4 +38,7 @@

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]

View File

@@ -22,6 +22,22 @@
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
<ObjectDataProvider x:Key="SortByEnum" MethodName="GetValues"
ObjectType="{x:Type sys:Enum}"
xmlns:sys="clr-namespace:System;assembly=mscorlib">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="models:SortBy"/>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
<ObjectDataProvider x:Key="SortOrderEnum" MethodName="GetValues"
ObjectType="{x:Type sys:Enum}"
xmlns:sys="clr-namespace:System;assembly=mscorlib">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="models:SortOrder"/>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
<Style x:Key="ModernButton" TargetType="Button">
<Setter Property="Background" Value="#007AFF"/>
<Setter Property="Foreground" Value="White"/>
@@ -62,11 +78,32 @@
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Text="我的待办" FontSize="24" FontWeight="Bold" Foreground="#333"/>
<StackPanel Grid.Column="1" Orientation="Horizontal" Margin="10,0,15,0" VerticalAlignment="Center">
<ComboBox ItemsSource="{Binding Source={StaticResource SortByEnum}}"
SelectedItem="{Binding SortBy}"
Width="90" VerticalContentAlignment="Center" Margin="0,0,5,0">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Converter={StaticResource EnumDescConverter}}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<ComboBox ItemsSource="{Binding Source={StaticResource SortOrderEnum}}"
SelectedItem="{Binding SortOrder}"
Width="60" VerticalContentAlignment="Center">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Converter={StaticResource EnumDescConverter}}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</StackPanel>
<Button Grid.Column="1" Content="设置快捷键"
<Button Grid.Column="2" Content="设置快捷键"
Command="{Binding OpenSettingsCommand}"
Background="Transparent" Foreground="#007AFF" Margin="0,0,15,0">
<Button.Template>
@@ -76,7 +113,7 @@
</Button.Template>
</Button>
<CheckBox Grid.Column="2" Content="显示已完成"
<CheckBox Grid.Column="3" Content="显示已完成"
IsChecked="{Binding ShowCompleted}"
VerticalAlignment="Center" Foreground="#555"/>
</Grid>

View File

@@ -1,5 +1,5 @@
#define MyAppName "TodoList"
#define MyAppVersion "1.0.18"
#define MyAppVersion "1.0.21"
#define MyAppPublisher "ShaoHua"
#define MyAppURL "https://git.we965.cn/Tools/TodoList"
#define MyAppExeName "TodoList.exe"