Порт десктопа с WinForms на Avalonia (.NET 8, Win/macOS/Linux). - Elfisa.Core: переносимая логика (ApiClient: логин/отчёт/ИИ, DTO, Session) - Дизайн-система в бирюзе #0F766E (свет/тьма, кнопки/поля/карточки/таблица/сайдбар) - Экран входа (реальный /auth/login), шелл с сайдбар-навигацией - «Отчёты»: 4 типа + авто-загрузка + ИИ-запрос -> Word/Excel, динамические колонки - Заглушки остальных разделов + README с дорожной картой портирования Проверено запуском: логин, живые данные покупателя, тема, таблица (скриншот). dev-автологин по ELF_DEV_USER/ELF_DEV_PASS. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
61 lines
2.0 KiB
C#
61 lines
2.0 KiB
C#
using System;
|
|
using Avalonia;
|
|
using Avalonia.Controls;
|
|
using Avalonia.Controls.Templates;
|
|
using Avalonia.Layout;
|
|
using Avalonia.Media;
|
|
using Elfisa.Avalonia.ViewModels;
|
|
|
|
namespace Elfisa.Avalonia.Views;
|
|
|
|
public partial class ReportsView : UserControl
|
|
{
|
|
private ReportsViewModel? _vm;
|
|
|
|
public ReportsView()
|
|
{
|
|
InitializeComponent();
|
|
DataContextChanged += OnDataContextChanged;
|
|
}
|
|
|
|
private void OnDataContextChanged(object? sender, EventArgs e)
|
|
{
|
|
if (_vm != null) _vm.ColumnsChanged -= RebuildColumns;
|
|
_vm = DataContext as ReportsViewModel;
|
|
if (_vm != null)
|
|
{
|
|
_vm.ColumnsChanged += RebuildColumns;
|
|
RebuildColumns();
|
|
}
|
|
}
|
|
|
|
// DataGrid не умеет динамические колонки через биндинг — строим их из VM в коде.
|
|
private void RebuildColumns()
|
|
{
|
|
Grid.Columns.Clear();
|
|
if (_vm == null) return;
|
|
|
|
for (int i = 0; i < _vm.Columns.Count; i++)
|
|
{
|
|
int idx = i;
|
|
var c = _vm.Columns[i];
|
|
Grid.Columns.Add(new DataGridTemplateColumn
|
|
{
|
|
Header = c.Header,
|
|
// одна тянущаяся колонка (star) заполняет свободное место, остальные фикс. пиксель
|
|
Width = c.Stretch
|
|
? new DataGridLength(1, DataGridLengthUnitType.Star)
|
|
: new DataGridLength(c.Weight, DataGridLengthUnitType.Pixel),
|
|
MinWidth = 56,
|
|
CellTemplate = new FuncDataTemplate<ReportRow>((row, _) => new TextBlock
|
|
{
|
|
Text = row?[idx] ?? "",
|
|
VerticalAlignment = VerticalAlignment.Center,
|
|
TextAlignment = c.Numeric ? TextAlignment.Right : TextAlignment.Left,
|
|
TextTrimming = TextTrimming.CharacterEllipsis
|
|
})
|
|
});
|
|
}
|
|
}
|
|
}
|