using System.Collections.ObjectModel; using System.ComponentModel; using System.Globalization; using System.Reflection; using System.Windows.Data; namespace ShrlAlgoToolkit.Mvvm.Converters; /// /// Description(描述特性)的枚举转换同时也是枚举源的集合 /// public class EnumItemsSourceAndConverter : Collection, IValueConverter { private IDictionary displayNameToValueMap; private Type type; private IDictionary valueToDisplayNameMap; public Type Type { get => type; set { if (!value.IsEnum) { throw new ArgumentException("不是枚举类型", $"{value}"); } type = value; Initialize(); } } /// /// 类属性到控件属性,源到目标 /// /// /// /// /// /// public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { //if (value != null) //{ // int n = (int)value; // if (n == 0 || n == -1) // { // return null; // } //} return value == null ? null : valueToDisplayNameMap.TryGetValue(value, out var value1) ? value1 : null; } /// /// 目标到源 /// /// /// /// /// /// public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { return value == null ? null : displayNameToValueMap.TryGetValue(value, out var value1) ? value1 : null; } private static object GetDescription(FieldInfo fieldInfo) { var descriptionAttribute = (DescriptionAttribute)Attribute.GetCustomAttribute(fieldInfo, typeof(DescriptionAttribute)); return descriptionAttribute != null ? descriptionAttribute.Description : fieldInfo.Name; } private void Initialize() { valueToDisplayNameMap = type.GetFields(BindingFlags.Static | BindingFlags.Public).ToDictionary(fi => fi.GetValue(null), GetDescription); displayNameToValueMap = valueToDisplayNameMap.ToDictionary(kvp => kvp.Value, kvp => kvp.Key); Clear(); //当前converter的集合添加元素 foreach (string name in displayNameToValueMap.Keys) { Add(name); } } }