using System; using System.Collections.Generic; using System.Threading.Tasks; using Avalonia; using Avalonia.Controls; using Avalonia.Layout; using Avalonia.Media; using Sln.Wcs.UI.ViewModels.Base; namespace Sln.Wcs.UI.Views.Base; public partial class EntityEditWindow : Window { private object? _entity; private TaskCompletionSource? _tcs; public EntityEditWindow() { InitializeComponent(); CancelBtn.Click += (_, _) => CloseWith(false); SaveBtn.Click += (_, _) => CloseWith(true); } public Task ShowDialog(object entity, List fields, bool isEdit, Window owner) { _entity = entity; TitleText.Text = isEdit ? "编辑" : "新增"; BuildForm(fields); _tcs = new TaskCompletionSource(); ShowDialog(owner); return _tcs.Task; } private void BuildForm(List fields) { FormPanel.Children.Clear(); if (_entity is null) return; var type = _entity.GetType(); foreach (var field in fields) { var prop = type.GetProperty(field.PropertyName); if (prop is null) continue; var value = prop.GetValue(_entity); // 字段卡片 var cell = new Border { Width = 345, Padding = new Thickness(12, 6), Margin = new Thickness(0, 3), }; var row = new Grid { ColumnDefinitions = new ColumnDefinitions("90,*") }; // 标签 var label = new TextBlock { Text = field.DisplayName, FontSize = 12, Foreground = Brush.Parse("#7B8FA8"), VerticalAlignment = VerticalAlignment.Center, }; row.Children.Add(label); // 输入框 Control input; if (field.FieldType == FieldType.CheckBox) { var cb = new CheckBox { IsChecked = value is int iv ? iv == 1 : (value as bool? ?? false), IsEnabled = !field.IsReadOnly, Foreground = Brush.Parse("#BCC8D6"), VerticalAlignment = VerticalAlignment.Center, }; cb.IsCheckedChanged += (_, _) => prop.SetValue(_entity, cb.IsChecked == true ? 1 : 0); input = cb; } else { var tb = new TextBox { Text = value?.ToString() ?? "", IsReadOnly = field.IsReadOnly, Watermark = field.DisplayName, Background = Brush.Parse("#0A0E14"), Foreground = Brush.Parse("#DDE4F0"), BorderBrush = Brush.Parse("#1A2F4A"), BorderThickness = new Thickness(1), CornerRadius = new CornerRadius(3), Padding = new Thickness(8, 5), FontSize = 12, }; if (field.FieldType == FieldType.Number) { tb.TextChanged += (_, _) => { if (int.TryParse(tb.Text, out var num)) prop.SetValue(_entity, num); }; } else { tb.TextChanged += (_, _) => prop.SetValue(_entity, tb.Text); } input = tb; } Grid.SetColumn(input, 1); row.Children.Add(input); cell.Child = row; FormPanel.Children.Add(cell); } } private void CloseWith(bool result) { _tcs?.TrySetResult(result); Close(); } }