WPF将列表框绑定到一个枚举,显示描述属性

有没有可能使用ObjectDataProvider方法绑定列表框到一个枚举,并以某种方式来显示描述属性? 如果是的话,怎么会这样做…?

是的,这是可能的。 这将做到这一点。 说我们有枚举

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方法可能应该去其他地方,但你得到的想法:)

如果绑定到Enum,则可以通过IValueConverter将其转换为描述。

请参阅绑定ComboBoxes枚举…在Silverlight中! 有关如何完成此操作的说明。

有关更多信息,请参阅http://msdn.microsoft.com/zh-CN/library/system.windows.data.ivalueconverter.aspx

您可以在项目中定义一个资源文件(* .resx文件)。 在这个文件中,你必须定义“键值对”,如下所示:

 "YellowCars" : "Yellow Cars", "RedCars" : "Red Cars", 

等等…

键是等于你的枚举条目,如下所示:

 public enum CarColors { YellowCars, RedCars } 

等等…

当你使用WPF时,你可以在你的XAML代码中实现,如下所示:

 <ComboBox ItemsSource="{Binding Source={StaticResource CarColors}}" SelectedValue="{Binding CarColor, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"> <ComboBox.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding Converter={StaticResource CarColorConverter}}" /> </DataTemplate> </ComboBox.ItemTemplate> </ComboBox> 

然后你必须写你的转换器,就像这样:

 using System; using System.Globalization; using System.Resources; using System.Windows.Data; public class CarColorConverter : IValueConverter { private static ResourceManager CarColors = new ResourceManager(typeof(Properties.CarColors)); public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { var key = ((Enum)value).ToString(); var result = CarColors.GetString(key); if (result == null) { result = key; } return result; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } 

我的答案是7年来的迟到;-)但也许它可以被别人使用!