Files

99 lines
2.9 KiB
C#
Raw Permalink Normal View History

2024-09-22 11:05:41 +08:00
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Globalization;
using System.Reflection;
using System.Windows.Data;
2026-02-21 16:31:24 +08:00
using ShrlAlgoToolkit.RevitAddins.UI.Converters;
using ShrlAlgoToolkit;
using ShrlAlgoToolkit.RevitAddins;
using ShrlAlgoToolkit.RevitAddins.UI;
namespace ShrlAlgoToolkit.RevitAddins.Common.Converters;
2024-09-22 11:05:41 +08:00
/// <summary>
/// Description描述特性的枚举转换同时也是枚举源的集合
/// </summary>
public class EnumItemsSourceAndConverter : Collection<string>, IValueConverter
{
2025-07-11 09:20:23 +08:00
private IDictionary<object, object> displayNameToValueMap;
private Type type;
2024-09-22 11:05:41 +08:00
2025-07-11 09:20:23 +08:00
private IDictionary<object, object> valueToDisplayNameMap;
2024-09-22 11:05:41 +08:00
2025-07-11 09:20:23 +08:00
public Type Type
{
get => type;
set
{
if (!value.IsEnum)
{
throw new ArgumentException("不是枚举类型", $"{value}");
}
2024-09-22 11:05:41 +08:00
2025-07-11 09:20:23 +08:00
type = value;
Initialize();
}
}
2024-09-22 11:05:41 +08:00
2025-07-11 09:20:23 +08:00
/// <summary>
/// 类属性到控件属性,源到目标
/// </summary>
/// <param name="value"></param>
/// <param name="targetType"></param>
/// <param name="parameter"></param>
/// <param name="culture"></param>
/// <returns></returns>
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;
}
2024-09-22 11:05:41 +08:00
2025-07-11 09:20:23 +08:00
/// <summary>
/// 目标到源
/// </summary>
/// <param name="value"></param>
/// <param name="targetType"></param>
/// <param name="parameter"></param>
/// <param name="culture"></param>
/// <returns></returns>
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return value == null
? null
: displayNameToValueMap.TryGetValue(value, out var value1)
? value1
: null;
}
2024-09-22 11:05:41 +08:00
2025-07-11 09:20:23 +08:00
private static object GetDescription(FieldInfo fieldInfo)
{
var descriptionAttribute = (DescriptionAttribute)Attribute.GetCustomAttribute(fieldInfo, typeof(DescriptionAttribute));
return descriptionAttribute != null ? descriptionAttribute.Description : fieldInfo.Name;
}
2024-09-22 11:05:41 +08:00
2025-07-11 09:20:23 +08:00
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);
}
}
2024-09-22 11:05:41 +08:00
}