refactor(gearTriggerPage): 重构触发器页面操作逻辑,改用行内操作按钮

移除全局选中触发器相关的属性、回调及列表选中绑定。将编辑、删除命令改为接收当前行触发器实例作为参数,不再依赖全局选中状态。在列表每行添加操作按钮,替换原顶部工具栏的批量编辑删除功能,同时调整新增按钮布局。
This commit is contained in:
辉鸭蛋
2026-05-18 02:44:51 +08:00
parent 0f05b99d04
commit 3ac0870169
2 changed files with 79 additions and 83 deletions

View File

@@ -194,6 +194,7 @@
<ColumnDefinition Width="150" /> <!-- 快捷键 -->
<ColumnDefinition Width="120" /> <!-- 快捷键类型 -->
<ColumnDefinition Width="*" /> <!-- 关联任务 -->
<ColumnDefinition Width="116" /> <!-- 操作 -->
</Grid.ColumnDefinitions>
<ui:TextBlock Grid.Column="0"
@@ -221,6 +222,11 @@
Foreground="{DynamicResource TextFillColorSecondaryBrush}"
FontWeight="SemiBold"
Text="关联任务" />
<ui:TextBlock Grid.Column="5"
HorizontalAlignment="Center"
Foreground="{DynamicResource TextFillColorSecondaryBrush}"
FontWeight="SemiBold"
Text="操作" />
</Grid>
</Border>
</DataTemplate>
@@ -234,6 +240,7 @@
<ColumnDefinition Width="220" /> <!-- 触发器名称 -->
<ColumnDefinition Width="220" /> <!-- CRON表达式 -->
<ColumnDefinition Width="*" /> <!-- 关联任务 -->
<ColumnDefinition Width="116" /> <!-- 操作 -->
</Grid.ColumnDefinitions>
<ui:TextBlock Grid.Column="0"
@@ -256,6 +263,11 @@
Foreground="{DynamicResource TextFillColorSecondaryBrush}"
FontWeight="SemiBold"
Text="关联任务" />
<ui:TextBlock Grid.Column="4"
HorizontalAlignment="Center"
Foreground="{DynamicResource TextFillColorSecondaryBrush}"
FontWeight="SemiBold"
Text="操作" />
</Grid>
</Border>
</DataTemplate>
@@ -277,6 +289,7 @@
<ColumnDefinition Width="150" /> <!-- 快捷键 -->
<ColumnDefinition Width="120" /> <!-- 快捷键类型 -->
<ColumnDefinition Width="*" /> <!-- 关联任务 -->
<ColumnDefinition Width="116" /> <!-- 操作 -->
</Grid.ColumnDefinitions>
<!-- 启用状态 -->
@@ -330,6 +343,21 @@
Text="{Binding TaskDefinitionName, TargetNullValue='未设置'}"
TextTrimming="CharacterEllipsis"
ToolTip="{Binding TaskDefinitionName}" />
<StackPanel Grid.Column="5"
Orientation="Horizontal"
HorizontalAlignment="Center"
VerticalAlignment="Center">
<ui:Button Command="{Binding DataContext.EditTriggerItemCommand, RelativeSource={RelativeSource AncestorType=UserControl}}"
CommandParameter="{Binding}"
Icon="{ui:SymbolIcon Edit24}"
Margin="0,0,4,0"
ToolTip="编辑" />
<ui:Button Command="{Binding DataContext.DeleteTriggerItemCommand, RelativeSource={RelativeSource AncestorType=UserControl}}"
CommandParameter="{Binding}"
Icon="{ui:SymbolIcon Delete24}"
ToolTip="删除" />
</StackPanel>
</Grid>
</Border>
</Grid>
@@ -360,6 +388,7 @@
<ColumnDefinition Width="220" /> <!-- 触发器名称 -->
<ColumnDefinition Width="220" /> <!-- CRON表达式 -->
<ColumnDefinition Width="*" /> <!-- 关联任务 -->
<ColumnDefinition Width="116" /> <!-- 操作 -->
</Grid.ColumnDefinitions>
<!-- 启用状态 -->
@@ -401,6 +430,21 @@
Text="{Binding TaskDefinitionName, TargetNullValue='未设置'}"
TextTrimming="CharacterEllipsis"
ToolTip="{Binding TaskDefinitionName}" />
<StackPanel Grid.Column="4"
Orientation="Horizontal"
HorizontalAlignment="Center"
VerticalAlignment="Center">
<ui:Button Command="{Binding DataContext.EditTriggerItemCommand, RelativeSource={RelativeSource AncestorType=UserControl}}"
CommandParameter="{Binding}"
Icon="{ui:SymbolIcon Edit24}"
Margin="0,0,4,0"
ToolTip="编辑" />
<ui:Button Command="{Binding DataContext.DeleteTriggerItemCommand, RelativeSource={RelativeSource AncestorType=UserControl}}"
CommandParameter="{Binding}"
Icon="{ui:SymbolIcon Delete24}"
ToolTip="删除" />
</StackPanel>
</Grid>
</Border>
</Grid>
@@ -430,26 +474,13 @@
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<!-- 工具栏 -->
<Border Grid.Row="0" Style="{StaticResource TriggerToolbarBorderStyle}">
<WrapPanel VerticalAlignment="Center">
<ui:Button Content="新增定时触发器"
Command="{Binding AddTimedTriggerCommand}"
Icon="{ui:SymbolIcon Add24}"
Appearance="Primary"
Margin="0,0,6,6" />
<ui:Button Content="编辑选中项"
Command="{Binding EditTriggerCommand}"
Icon="{ui:SymbolIcon Edit24}"
Appearance="Secondary"
Margin="0,0,6,6" />
<ui:Button Content="删除选中项"
Command="{Binding DeleteTriggerCommand}"
Icon="{ui:SymbolIcon Delete24}"
Appearance="Secondary"
Margin="0,0,6,6" />
</WrapPanel>
</Border>
<Grid Grid.Row="0" Margin="16,12,16,0">
<ui:Button HorizontalAlignment="Right"
Content="新增定时触发器"
Command="{Binding AddTimedTriggerCommand}"
Icon="{ui:SymbolIcon Add24}"
Appearance="Primary" />
</Grid>
<!-- 固定表格头部 -->
<ContentPresenter Grid.Row="1"
@@ -459,7 +490,6 @@
<Grid Grid.Row="2"
Margin="0,6,0,12">
<ui:ListView ItemsSource="{Binding TimedTriggers}"
SelectedItem="{Binding SelectedTrigger, Mode=TwoWay}"
ItemContainerStyle="{StaticResource TriggerListViewItemStyle}"
ItemTemplate="{StaticResource TimedTriggerItemTemplate}"
Style="{StaticResource TriggerListViewStyle}" />
@@ -498,26 +528,13 @@
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<!-- 工具栏 -->
<Border Grid.Row="0" Style="{StaticResource TriggerToolbarBorderStyle}">
<WrapPanel VerticalAlignment="Center">
<ui:Button Content="新增快捷键触发器"
Command="{Binding AddHotkeyTriggerCommand}"
Icon="{ui:SymbolIcon Add24}"
Appearance="Primary"
Margin="0,0,6,6" />
<ui:Button Content="编辑选中项"
Command="{Binding EditTriggerCommand}"
Icon="{ui:SymbolIcon Edit24}"
Appearance="Secondary"
Margin="0,0,6,6" />
<ui:Button Content="删除选中项"
Command="{Binding DeleteTriggerCommand}"
Icon="{ui:SymbolIcon Delete24}"
Appearance="Secondary"
Margin="0,0,6,6" />
</WrapPanel>
</Border>
<Grid Grid.Row="0" Margin="16,12,16,0">
<ui:Button HorizontalAlignment="Right"
Content="新增快捷键触发器"
Command="{Binding AddHotkeyTriggerCommand}"
Icon="{ui:SymbolIcon Add24}"
Appearance="Primary" />
</Grid>
<!-- 固定表格头部 -->
<ContentPresenter Grid.Row="1"
@@ -527,7 +544,6 @@
<Grid Grid.Row="2"
Margin="0,6,0,12">
<ui:ListView ItemsSource="{Binding HotkeyTriggers}"
SelectedItem="{Binding SelectedTrigger, Mode=TwoWay}"
ItemContainerStyle="{StaticResource TriggerListViewItemStyle}"
ItemTemplate="{StaticResource TriggerItemTemplate}"
Style="{StaticResource TriggerListViewStyle}" />

View File

@@ -4,7 +4,6 @@ using System.Linq;
using System.Threading.Tasks;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using BetterGenshinImpact.Model;
using BetterGenshinImpact.Model.Gear.Triggers;
using BetterGenshinImpact.Service;
using BetterGenshinImpact.Service.GearTask;
@@ -28,12 +27,6 @@ public partial class GearTriggerPageViewModel : ViewModel
[ObservableProperty]
private ObservableCollection<GearTriggerViewModel> _hotkeyTriggers = new();
[ObservableProperty]
private GearTriggerViewModel? _selectedTrigger;
[ObservableProperty]
private GearTaskDefinitionViewModel? _selectedTaskDefinition;
public GearTriggerPageViewModel(
ILogger<GearTriggerPageViewModel> logger,
GearTriggerStorageService storageService,
@@ -44,11 +37,6 @@ public partial class GearTriggerPageViewModel : ViewModel
_quartzSchedulerService = quartzSchedulerService;
}
partial void OnSelectedTriggerChanged(GearTriggerViewModel? value)
{
EditTriggerCommand.NotifyCanExecuteChanged();
}
public override void OnNavigatedTo()
{
_ = LoadTriggersAsync();
@@ -175,7 +163,6 @@ public partial class GearTriggerPageViewModel : ViewModel
};
TimedTriggers.Add(newTrigger);
SelectedTrigger = newTrigger;
newTrigger.UpdateNextRunTime();
await SaveTriggersAsync();
@@ -199,70 +186,63 @@ public partial class GearTriggerPageViewModel : ViewModel
};
HotkeyTriggers.Add(newTrigger);
SelectedTrigger = newTrigger;
await SaveTriggersAsync();
}
[RelayCommand]
private async Task DeleteTrigger()
private async Task DeleteTriggerItem(GearTriggerViewModel? trigger)
{
if (SelectedTrigger == null)
if (trigger == null)
{
return;
}
switch (SelectedTrigger.TriggerType)
switch (trigger.TriggerType)
{
case TriggerType.Timed:
TimedTriggers.Remove(SelectedTrigger);
TimedTriggers.Remove(trigger);
break;
case TriggerType.Hotkey:
HotkeyTriggers.Remove(SelectedTrigger);
HotkeyTriggers.Remove(trigger);
break;
}
SelectedTrigger = null;
await SaveTriggersAsync();
}
private bool CanEditTrigger()
[RelayCommand]
private async Task EditTriggerItem(GearTriggerViewModel? trigger)
{
return SelectedTrigger != null;
}
[RelayCommand(CanExecute = nameof(CanEditTrigger))]
private async Task EditTrigger()
{
if (SelectedTrigger is not { } selectedTrigger)
if (trigger == null)
{
return;
}
var dialog = AddTriggerDialog.ShowEditTriggerDialog(selectedTrigger);
var dialog = AddTriggerDialog.ShowEditTriggerDialog(trigger);
if (dialog == null)
{
return;
}
selectedTrigger.Name = dialog.TriggerName;
selectedTrigger.IsEnabled = dialog.IsEnabled;
selectedTrigger.TaskDefinitionName = dialog.SelectedTaskDefinitionName;
trigger.Name = dialog.TriggerName;
trigger.IsEnabled = dialog.IsEnabled;
trigger.TaskDefinitionName = dialog.SelectedTaskDefinitionName;
if (selectedTrigger.TriggerType == TriggerType.Timed)
if (trigger.TriggerType == TriggerType.Timed)
{
selectedTrigger.CronExpression = dialog.CronExpression;
selectedTrigger.Hotkey = null;
trigger.CronExpression = dialog.CronExpression;
trigger.Hotkey = null;
}
else if (selectedTrigger.TriggerType == TriggerType.Hotkey)
else if (trigger.TriggerType == TriggerType.Hotkey)
{
selectedTrigger.Hotkey = dialog.SelectedHotkey;
selectedTrigger.HotkeyType = dialog.HotkeyType;
selectedTrigger.CronExpression = null;
trigger.Hotkey = dialog.SelectedHotkey;
trigger.HotkeyType = dialog.HotkeyType;
trigger.CronExpression = null;
}
selectedTrigger.ModifiedTime = DateTime.Now;
selectedTrigger.UpdateNextRunTime();
trigger.ModifiedTime = DateTime.Now;
trigger.UpdateNextRunTime();
await SaveTriggersAsync();
}