using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Runtime.CompilerServices; namespace AI.Models.SpecialMessages { /// /// 表示一条「必需列 -> 预览列」的匹配项,用于绑定显示。 /// public class ColumnMappingItem : INotifyPropertyChanged { private string _requiredColumn = string.Empty; private string _matchedColumn = string.Empty; /// 必需列名称 public string RequiredColumn { get => _requiredColumn; set => SetProperty(ref _requiredColumn, value ?? string.Empty); } /// 匹配到的预览列名称(未匹配时可为空) public string MatchedColumn { get => _matchedColumn; set => SetProperty(ref _matchedColumn, value ?? string.Empty); } public event PropertyChangedEventHandler? PropertyChanged; protected void OnPropertyChanged([CallerMemberName] string? propertyName = null) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); protected bool SetProperty(ref T field, T value, [CallerMemberName] string? propertyName = null) { if (EqualityComparer.Default.Equals(field, value)) return false; field = value; OnPropertyChanged(propertyName); return true; } } /// /// 列头匹配特殊消息 - 用于在聊天流中展示「必需列」与「预览列」及其匹配关系。 /// public class ColumnMatchMessage : ISpecialMessage, INotifyPropertyChanged { private string _title = "列头匹配"; /// 消息唯一标识符 public string Id { get; set; } = Guid.NewGuid().ToString(); /// 类型名称 public string TypeName => "ColumnMatch"; /// 不需要实时更新 public bool IsLive => false; /// 标题(如「列头匹配」) public string Title { get => _title; set => SetProperty(ref _title, value ?? string.Empty); } /// 必需列名称列表 public ObservableCollection RequiredColumns { get; } = new ObservableCollection(); /// 预览列(可用列)名称列表 public ObservableCollection PreviewColumns { get; } = new ObservableCollection(); /// 匹配关系:必需列 -> 匹配的预览列 public ObservableCollection Mappings { get; } = new ObservableCollection(); public event PropertyChangedEventHandler? PropertyChanged; protected void OnPropertyChanged([CallerMemberName] string? propertyName = null) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); protected bool SetProperty(ref T field, T value, [CallerMemberName] string? propertyName = null) { if (EqualityComparer.Default.Equals(field, value)) return false; field = value; OnPropertyChanged(propertyName); return true; } /// 设置必需列与预览列,并清空匹配关系 public void SetColumns(IEnumerable requiredColumns, IEnumerable previewColumns) { RequiredColumns.Clear(); foreach (var c in requiredColumns ?? Array.Empty()) RequiredColumns.Add(c ?? string.Empty); PreviewColumns.Clear(); foreach (var c in previewColumns ?? Array.Empty()) PreviewColumns.Add(c ?? string.Empty); Mappings.Clear(); } /// 设置匹配关系(必需列 -> 预览列),会清空并替换当前 Mappings public void SetMappings(IEnumerable> mappings) { Mappings.Clear(); if (mappings == null) return; foreach (var kv in mappings) { Mappings.Add(new ColumnMappingItem { RequiredColumn = kv.Key ?? string.Empty, MatchedColumn = kv.Value ?? string.Empty, }); } } } }