You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
114 lines
4.4 KiB
C#
114 lines
4.4 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Collections.ObjectModel;
|
|
using System.ComponentModel;
|
|
using System.Runtime.CompilerServices;
|
|
|
|
namespace AI.Models.SpecialMessages
|
|
{
|
|
/// <summary>
|
|
/// 表示一条「必需列 -> 预览列」的匹配项,用于绑定显示。
|
|
/// </summary>
|
|
public class ColumnMappingItem : INotifyPropertyChanged
|
|
{
|
|
private string _requiredColumn = string.Empty;
|
|
private string _matchedColumn = string.Empty;
|
|
|
|
/// <summary>必需列名称</summary>
|
|
public string RequiredColumn
|
|
{
|
|
get => _requiredColumn;
|
|
set => SetProperty(ref _requiredColumn, value ?? string.Empty);
|
|
}
|
|
|
|
/// <summary>匹配到的预览列名称(未匹配时可为空)</summary>
|
|
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<T>(ref T field, T value, [CallerMemberName] string? propertyName = null)
|
|
{
|
|
if (EqualityComparer<T>.Default.Equals(field, value)) return false;
|
|
field = value;
|
|
OnPropertyChanged(propertyName);
|
|
return true;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 列头匹配特殊消息 - 用于在聊天流中展示「必需列」与「预览列」及其匹配关系。
|
|
/// </summary>
|
|
public class ColumnMatchMessage : ISpecialMessage, INotifyPropertyChanged
|
|
{
|
|
private string _title = "列头匹配";
|
|
|
|
/// <summary>消息唯一标识符</summary>
|
|
public string Id { get; set; } = Guid.NewGuid().ToString();
|
|
|
|
/// <summary>类型名称</summary>
|
|
public string TypeName => "ColumnMatch";
|
|
|
|
/// <summary>不需要实时更新</summary>
|
|
public bool IsLive => false;
|
|
|
|
/// <summary>标题(如「列头匹配」)</summary>
|
|
public string Title
|
|
{
|
|
get => _title;
|
|
set => SetProperty(ref _title, value ?? string.Empty);
|
|
}
|
|
|
|
/// <summary>必需列名称列表</summary>
|
|
public ObservableCollection<string> RequiredColumns { get; } = new ObservableCollection<string>();
|
|
|
|
/// <summary>预览列(可用列)名称列表</summary>
|
|
public ObservableCollection<string> PreviewColumns { get; } = new ObservableCollection<string>();
|
|
|
|
/// <summary>匹配关系:必需列 -> 匹配的预览列</summary>
|
|
public ObservableCollection<ColumnMappingItem> Mappings { get; } = new ObservableCollection<ColumnMappingItem>();
|
|
|
|
public event PropertyChangedEventHandler? PropertyChanged;
|
|
protected void OnPropertyChanged([CallerMemberName] string? propertyName = null) =>
|
|
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
|
|
protected bool SetProperty<T>(ref T field, T value, [CallerMemberName] string? propertyName = null)
|
|
{
|
|
if (EqualityComparer<T>.Default.Equals(field, value)) return false;
|
|
field = value;
|
|
OnPropertyChanged(propertyName);
|
|
return true;
|
|
}
|
|
|
|
/// <summary>设置必需列与预览列,并清空匹配关系</summary>
|
|
public void SetColumns(IEnumerable<string> requiredColumns, IEnumerable<string> previewColumns)
|
|
{
|
|
RequiredColumns.Clear();
|
|
foreach (var c in requiredColumns ?? Array.Empty<string>())
|
|
RequiredColumns.Add(c ?? string.Empty);
|
|
PreviewColumns.Clear();
|
|
foreach (var c in previewColumns ?? Array.Empty<string>())
|
|
PreviewColumns.Add(c ?? string.Empty);
|
|
Mappings.Clear();
|
|
}
|
|
|
|
/// <summary>设置匹配关系(必需列 -> 预览列),会清空并替换当前 Mappings</summary>
|
|
public void SetMappings(IEnumerable<KeyValuePair<string, string>> 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,
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|