3.9 KiB
3.9 KiB
name, description, disable-model-invocation
| name | description | disable-model-invocation |
|---|---|---|
| add-list-page | 在 PipeReviewReport 客户端中新建同构列表页(KPI + FilterBar + DataGrid + Pagination + 列配置 + LoadingCover)。Round 5 项目管理页是标准样板;视频/缺陷列表复用同一骨架。 | false |
新建列表页(KPI + 筛选 + 表格)
本项目多个业务列表页结构同构。以 PipeReviewReport.Projects 的
ProjectsMainView / ProjectsMainViewModel 为样板,组装而非重写。
骨架结构
page-head(标题 + 刷新 / 导出 / 新建)
KPI × N(f:KpiCard)
f:FilterBar(左筛选 + 右列配置)
卡片:DataGrid + hc:Pagination + f:LoadingCover
Framework 可复用件(禁止模块内再写一份)
| 组件 | 命名空间 / 路径 |
|---|---|
KpiCard |
Framework/Controls/KpiCard |
FilterBar |
Framework/Controls/FilterBar(Filters / Actions 槽) |
LoadingCover |
Framework/Controls/LoadingCover |
ColumnConfigDialog |
Framework/Views/Dialogs/ColumnConfigDialog |
IColumnConfigService |
GetVisibleColumnsAsync / SaveVisibleColumnsAsync |
IExcelExportService |
动态列头导出 xlsx |
ColumnDefinition / ExcelColumn |
Framework/Models |
hc:Pagination / hc:SearchBar / hc:Tag / hc:Empty |
HandyControl |
ViewModel 约定
- Primary Constructor 注入数据服务;
OnInitializeInRuntime填筛选项默认值;LoadedOnce拉数。 LoadingStatus+f:LoadingCover;禁止自建IsBusy。- 分页:
PageIndex/MaxPageCount+PagedQueryHelper;写回页码时用suppressPageReload防递归。 - 筛选变更 → 页码归 1 → 重查;搜索用
hc:SearchBar.Command。 - 列可见性:模块内静态
XxxListColumns.All/DefaultVisible/ResolveVisible;VM 暴露ColXxxVisibility;页面资源放f:BindingProxy Data="{Binding}",DataGrid 列用Visibility="{Binding Data.ColXxxVisibility, Source={StaticResource VmProxy}}"(禁止x:Reference绑到 Root,会循环依赖)。 - 行内命令:
RelativeSource AncestorType=DataGrid取页面 DataContext,不要用x:Reference Root。 - 弹窗:
DialogViewModelOkCancel+f:DialogService+ShowOKCancel(见add-dialogskill)。 - 导出:
SaveFileDialogService→ 按当前筛选拉全量(设上限)→ 仅导出可见列。
XAML 注册示例
<UserControl x:Name="Root" Style="{DynamicResource UserControlStyle}" ...>
<dxmvvm:Interaction.Behaviors>
<f:DialogService x:Name="XxxEditDialog" ContentType="{x:Type dialogs:XxxEditDialog}"/>
<f:DialogService x:Name="ColumnConfigDialog" ContentType="{x:Type f:ColumnConfigDialog}"/>
<dxmvvm:SaveFileDialogService x:Name="SaveFileDialog"/>
</dxmvvm:Interaction.Behaviors>
...
<f:FilterBar>
<f:FilterBar.Filters><!-- SearchBar + ComboBox --></f:FilterBar.Filters>
<f:FilterBar.Actions>
<Button Command="{Binding ColumnConfigCommand}" Content="列配置"/>
</f:FilterBar.Actions>
</f:FilterBar>
</UserControl>
列配置调用
ColumnConfigDialogParameter parameter = new(DataScope.Xxx, XxxListColumns.All, visibleKeys.ToList());
if (ColumnConfigDialog.ShowOKCancel(this, parameter) && parameter.Result is not null)
{
List<string> resolved = XxxListColumns.ResolveVisible(parameter.Result);
await columnConfigService.SaveVisibleColumnsAsync(DataScope.Xxx, resolved);
ApplyVisibleColumns(resolved);
}
检查清单
- 用了
KpiCard/FilterBar/LoadingCover/ FrameworkColumnConfigDialog - 列 Key 与导出
ExcelColumn.Key一致 - 空列表有
hc:Empty - 删除走
IMessageBoxServiceEx.ShowOkCancelWarning(确认框优先 OK/Cancel,见handycontrol-usage.md) - 无
var;MVVM 属性用GetProperty/SetProperty;Command 用field ??= - 输入框已显式
MaxLength="{x:Static shared:InputLimits.Path/Text}"(搜索框用 Text)