是否可以使用ObjectDataProvider方法将ListBox绑定到枚举,并以某种方式设置其样式以显示Description属性?如果是这样,人们将如何去做……?
是的,有可能。这样就可以了。说我们有枚举
public enum MyEnum { [Description("MyEnum1 Description")] MyEnum1, [Description("MyEnum2 Description")] MyEnum2, [Description("MyEnum3 Description")] MyEnum3 }
然后我们可以使用ObjectDataProvider作为
xmlns:MyEnumerations="clr-namespace:MyEnumerations" <ObjectDataProvider MethodName="GetValues" ObjectType="{x:Type sys:Enum}" x:Key="MyEnumValues"> <ObjectDataProvider.MethodParameters> <x:Type TypeName="MyEnumerations:MyEnum" /> </ObjectDataProvider.MethodParameters> </ObjectDataProvider>
对于ListBox,我们将ItemsSource设置为MyEnumValues,并使用Converter来应用ItemTemplate。
<ListBox Name="c_myListBox" SelectedIndex="0" Margin="8" ItemsSource="{Binding Source={StaticResource MyEnumValues}}"> <ListBox.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding Converter={StaticResource EnumDescriptionConverter}}"/> </DataTemplate> </ListBox.ItemTemplate> </ListBox>
在转换器中,我们得到描述并返回
public class EnumDescriptionConverter : IValueConverter { private string GetEnumDescription(Enum enumObj) { FieldInfo fieldInfo = enumObj.GetType().GetField(enumObj.ToString()); object[] attribArray = fieldInfo.GetCustomAttributes(false); if (attribArray.Length == 0) { return enumObj.ToString(); } else { DescriptionAttribute attrib = attribArray[0] as DescriptionAttribute; return attrib.Description; } } object IValueConverter.Convert(object value, Type targetType, object parameter, CultureInfo culture) { Enum myEnum = (Enum)value; string description = GetEnumDescription(myEnum); return description; } object IValueConverter.ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { return string.Empty; } }
GetEnumDescription方法可能应该放在其他地方,但您会明白的:)
选中GetEnumDescription作为扩展方法。