我希望尽可能地简化将枚举绑定到ComboBox的过程。
在多种解决方案(ObjectDataProvider、Converter等)中,我选择了以下MarkupExtension:
public class EnumSource : MarkupExtension
{
public class EnumMember
{
public string Display { get; set; }
public object Value { get; set; }
public override string ToString()
{
return Display;
}
}
private readonly Type EnumType;
public EnumSource(Type type)
{
EnumType = type;
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
var enumValues = Enum.GetValues(EnumType);
return (
from object enumValue in enumValues
select new EnumMember
{
Value = enumValue,
Display = GetDescription(enumValue)
}).ToArray();
}
private string GetDescription(object enumValue)
{
var descriptionAttribute = EnumType
.GetField(enumValue.ToString())
.GetCustomAttributes(typeof(DescriptionAttribute), false)
.FirstOrDefault() as DescriptionAttribute;
return (descriptionAttribute != null) ? descriptionAttribute.Description : enumValue.ToString();
}
}
<ComboBox ItemsSource="{Binding Source={my:EnumSource {x:Type my:Options}}}" SelectedValue="{Binding Path=CurrentOption}" SelectedValuePath="Value" />
你可能注意到,我通过在EnumMember类中添加ToString()方法来摆脱了DisplayMemberPath="Display"。
是否有可能用类操作符(EnumMember内部)或类似的东西来替换SelectedValuePath="Value"属性?
谢谢!