视觉修改
This commit is contained in:
		
							
								
								
									
										114
									
								
								Check.Main/Common/ModelSelectionConverter.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										114
									
								
								Check.Main/Common/ModelSelectionConverter.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,114 @@ | ||||
| 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); | ||||
|         } | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user