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年来的迟到;-)但也许它可以被别人使用!