using System; using System.Collections.Generic; using System.ComponentModel; using System.Globalization; using System.Linq; using System.Text; using System.Threading.Tasks; using static System.ComponentModel.TypeConverter; namespace Check.Main.Common { /// /// 一个自定义的 TypeConverter,用于在 PropertyGrid 中为模型选择提供一个下拉列表。 /// public class ModelSelectionConverter : Int32Converter // 我们转换的是整数 (ModelId) { // 告诉 PropertyGrid,我们支持从一个标准值集合中进行选择 public override bool GetStandardValuesSupported(ITypeDescriptorContext context) { return true; } // 告诉 PropertyGrid,我们只允许用户从列表中选择,不允许手动输入 public override bool GetStandardValuesExclusive(ITypeDescriptorContext context) { return true; } // 这是最核心的方法:提供标准值的列表 public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) { try { // 从中央配置管理器获取所有已配置的模型 var modelSettings = ConfigurationManager.GetCurrentConfig().ModelSettings; if (modelSettings == null || modelSettings.Count == 0) { // 如果没有模型,返回一个包含默认值 "0"(代表“无”)的列表 return new StandardValuesCollection(new[] { 0 }); } // 使用LINQ从模型列表中提取所有模型的ID // .Prepend(0) 在列表开头添加一个 "0",代表“未选择”的选项 var modelIds = modelSettings.Select(m => m.Id).Prepend(0).ToArray(); return new StandardValuesCollection(modelIds); } catch { // 如果在获取过程中发生任何异常,返回一个安全的默认值 return new StandardValuesCollection(new[] { 0 }); } } // --- 为了让下拉列表显示模型名称而不是ID,我们还需要重写以下方法 --- public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) { return sourceType == typeof(string) || base.CanConvertFrom(context, sourceType); } public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) { return destinationType == typeof(string) || base.CanConvertTo(context, destinationType); } // 将模型ID转换为其对应的名称字符串,以便在UI上显示 public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) { if (destinationType == typeof(string) && value is int modelId) { if (modelId == 0) { return "未选择"; // 对ID为0的特殊处理 } // 查找ID对应的模型名称 var model = ConfigurationManager.GetCurrentConfig() .ModelSettings? .FirstOrDefault(m => m.Id == modelId); // 返回 "名称 (ID)" 的格式,更清晰 return model != null ? $"{model.Name} (ID: {model.Id})" : "未知模型"; } return base.ConvertTo(context, culture, value, destinationType); } // 将用户在UI上选择的名称字符串,转换回其对应的模型ID,以便保存 public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { if (value is string displayString) { if (displayString == "未选择") { return 0; } // 从 "名称 (ID: X)" 格式中解析出ID if (displayString.Contains("(ID: ") && displayString.EndsWith(")")) { var startIndex = displayString.IndexOf("(ID: ") + 5; var endIndex = displayString.Length - 1; var idString = displayString.Substring(startIndex, endIndex - startIndex); if (int.TryParse(idString, out int modelId)) { return modelId; } } } return base.ConvertFrom(context, culture, value); } } }