From c8be7022cc164e08297549348f013510c6c74057 Mon Sep 17 00:00:00 2001 From: adamyu Date: Tue, 23 Jun 2026 12:38:04 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=F0=9F=90=9B=20fix(ui):=20=E5=AE=9E?= =?UTF-8?q?=E6=97=B6=E6=95=B0=E6=8D=AE=E3=80=8C=E4=BB=BB=E5=8A=A1=E7=AD=9B?= =?UTF-8?q?=E9=80=89=E3=80=8D=E4=B8=8B=E6=8B=89=E6=98=BE=E7=A4=BA=E5=8F=AF?= =?UTF-8?q?=E8=AF=BB=E5=90=8D=E8=80=8C=E9=9D=9E=20ULID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 下拉原绑 AvailableTaskIds(ULID 列表)。改为 AvailableTasks(TaskPick: Id+Display), 下拉显 DisplayName、按 Id 过滤(TaskFilter 仍是 id,RowsView 过滤不变)。名字载入后(LoadTaskNamesAsync) 回填下拉项显示名。接上次「任务列显名」,补齐筛选面。 Co-Authored-By: Claude Opus 4.8 (1M context) --- src/Dc.App/ViewModels/LiveDataViewModel.cs | 16 ++++++++++++---- src/Dc.App/Views/LiveDataView.xaml | 6 ++++-- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/Dc.App/ViewModels/LiveDataViewModel.cs b/src/Dc.App/ViewModels/LiveDataViewModel.cs index ccb345f..bac5576 100644 --- a/src/Dc.App/ViewModels/LiveDataViewModel.cs +++ b/src/Dc.App/ViewModels/LiveDataViewModel.cs @@ -82,7 +82,8 @@ internal void DebounceTickForTest() private volatile LiveFlushStats _statsSnapshot = new(0, 0, 0, 0, 0); public ObservableCollection Rows { get; } = new(); - public ObservableCollection AvailableTaskIds { get; } = new(); + // 任务筛选下拉项:Id + 可读名(Display)。下拉显名、按 Id 过滤(TaskFilter 仍是 id,RowsView 不变)。 + public ObservableCollection AvailableTasks { get; } = new(); public ICollectionView RowsView { get; } private bool _running; @@ -140,8 +141,14 @@ private async Task LoadTaskNamesAsync() try { _taskNames = await TaskNames.LoadAsync(_dbFactory); - // 回填已存在行的可读名(行可能先于名字加载就创建)。Start 在 UI 线程,await 续回 UI 线程,改 Rows 安全。 + // 回填已存在行的可读名(行可能先于名字加载就创建)。Start 在 UI 线程,await 续回 UI 线程,改集合安全。 foreach (var row in Rows) row.TaskName = ResolveTaskName(row.TaskId); + // 同步刷新任务筛选下拉的显示名(此前以 id 兜底加入) + for (var i = 0; i < AvailableTasks.Count; i++) + { + var name = ResolveTaskName(AvailableTasks[i].Id); + if (AvailableTasks[i].Display != name) AvailableTasks[i] = new TaskPick(AvailableTasks[i].Id, name); + } } catch { /* 名字解析失败不影响数据流,列回退显示 id */ } } @@ -239,7 +246,8 @@ private LiveFlushStats ComputeFlushStats() private void Apply(string taskId, TagValue v, int rawCount) { - if (!AvailableTaskIds.Contains(taskId)) AvailableTaskIds.Add(taskId); + if (AvailableTasks.All(t => t.Id != taskId)) + AvailableTasks.Add(new TaskPick(taskId, ResolveTaskName(taskId))); var key = $"{taskId}::{v.Item}"; if (!_rowIndex.TryGetValue(key, out var row)) @@ -269,7 +277,7 @@ private void Clear() _searchDebounce?.Stop(); // 清空后避免挂起的防抖回调刷新已清集合 _rowIndex.Clear(); Rows.Clear(); - AvailableTaskIds.Clear(); + AvailableTasks.Clear(); RowCount = 0; // 重置 flush 统计累计器,避免清空后陈旧统计(ring 数组无需清零,count=0 即 n=0) diff --git a/src/Dc.App/Views/LiveDataView.xaml b/src/Dc.App/Views/LiveDataView.xaml index 0d5c830..fd5313e 100644 --- a/src/Dc.App/Views/LiveDataView.xaml +++ b/src/Dc.App/Views/LiveDataView.xaml @@ -32,8 +32,10 @@ VerticalAlignment="Center" Margin="0,0,6,0" /> + diff --git a/src/Dc.App/ViewModels/TagsViewModel.cs b/src/Dc.App/ViewModels/TagsViewModel.cs index 9fc2881..5c10348 100644 --- a/src/Dc.App/ViewModels/TagsViewModel.cs +++ b/src/Dc.App/ViewModels/TagsViewModel.cs @@ -20,6 +20,7 @@ public partial class TagsViewModel : ObservableObject, IEmbeddableTagPanel private readonly ITagExcelService _excel; private readonly IFilePicker _filePicker; private readonly TaskOrchestrator _orchestrator; + private readonly Action? _navigate; // 导航到其它页(空状态「浏览节点」CTA → "browse") [ObservableProperty] private string _title = "Tag 管理"; [ObservableProperty] private bool _isLoading; @@ -55,16 +56,22 @@ public TagsViewModel( ITagEditorDialog editor, ITagExcelService excel, IFilePicker filePicker, - TaskOrchestrator orchestrator) + TaskOrchestrator orchestrator, + Action? navigate = null) { _dbFactory = dbFactory; _editor = editor; _excel = excel; _filePicker = filePicker; _orchestrator = orchestrator; + _navigate = navigate; _ = LoadAsync(); } + // 空状态主 CTA:跳到「浏览节点」(发现→批量加 Tag 主路径)。 + [RelayCommand] + private void BrowseNodes() => _navigate?.Invoke("browse"); + private bool IsTaskRunning(string taskId) => _orchestrator.RunningTaskIds.Contains(taskId); diff --git a/src/Dc.App/Views/TagsView.xaml b/src/Dc.App/Views/TagsView.xaml index c593f0f..def4670 100644 --- a/src/Dc.App/Views/TagsView.xaml +++ b/src/Dc.App/Views/TagsView.xaml @@ -119,13 +119,15 @@ - +