115 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			115 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| 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
 | ||
| {
 | ||
|     /// <summary>
 | ||
|     /// 一个自定义的 TypeConverter,用于在 PropertyGrid 中为模型选择提供一个下拉列表。
 | ||
|     /// </summary>
 | ||
|     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);
 | ||
|         }
 | ||
|     }
 | ||
| }
 |