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,
});
}
}
}
}