在WPF中枚举绑定到ItemsSource。

一、通过ObjectDataProvider 获取Enum数据源

首先我们定义一个Enum类:

 public enum TableSelectedType
    {
        SelectedOne,
 
        SelectedTwo,
 
        SelectedThird
    }

接着在Xaml中的Resource里定义数据源。

<UserControl.Resources>
        <ObjectDataProvider x:Key="odp" MethodName="GetNames" ObjectType="{x:Type System:Enum}">
            <ObjectDataProvider.MethodParameters>
                <x:Type TypeName="local:TableSelectedType"/>
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>
 </UserControl.Resources>

我们这里写好了一个Enum数据源,他的key是odp。我们把它绑定到ComboBox的ItemsSource上看下。

<ComboBox ItemsSource="{Binding Source={StaticResource odp}}"/>

效果图:

image

但是有时候,我们要绑定的是Enum,但想显示它相应的中文字符串。比如“SelectOne”显示为“第一条”。

这里我用到了转换器(Converter).

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
       {
           string[] enmus = value as string[];
           List<string> result=new List<string>();
           foreach (var item in enmus)
           {
               switch (item)
               {
                   case "SelectedOne":
                      result.Add("第一行");
                       break;
                   case "SelectedTwo":
                       result.Add("第二行");
                       break;
                   case "SelectedThird":
                       result.Add("第三行");
                       break;
               }
           }
           return result;
       }

xaml中:

 <ComboBox ItemsSource="{Binding Source={StaticResource odp}, Converter={StaticResource EnumTypeToStringConverter}}"/>

效果:

image

二、通过Dictionary来存Enum,并绑定到ItemsSource上

这种方便且效率高。我们还是用上面的Enum类型。我们声明一个Dictionary的属性TableSelectedTypeCollection ,并对他初始话。

 public partial class ConboBoxEnum : UserControl
    {
        public ConboBoxEnum()
        {
            InitializeComponent();
 
            TableSelectedTypeCollection=new Dictionary<TableSelectedType, string>();
            TableSelectedTypeCollection.Add(TableSelectedType.SelectedOne,"第一条");
            TableSelectedTypeCollection.Add(TableSelectedType.SelectedTwo,"第二条");
            TableSelectedTypeCollection.Add(TableSelectedType.SelectedThird,"第三条");
            this.DataContext = this;
        }
 
        public Dictionary<TableSelectedType, string> TableSelectedTypeCollection { get; set; }
    }

Xaml中,我们用TableSelectedTypeCollection 来绑定ComboBox的ItemsSource。

<ComboBox ItemsSource="{Binding TableSelectedTypeCollection}" SelectedValue="{Binding TableSelectedType}" DisplayMemberPath="Value"/>

这里我们用Value来显示它对应的中文字。SelectedValue来绑定它的Enum类型。因为后台我们通常用Enum中的类型。

效果还是一样。 
image

三、通过特性(Attribute)来获取

这里用到了MS命名空间下的using System.ComponentModel;在枚举元素上加Description这个特性。

 public enum TableSelectedType
    {
        [Description("选择第一行")]
        SelectedOne,
        [Description("选择第二行")]
        SelectedTwo,
        [Description("选择第三行")]
        SelectedThird
    }

 

我们写一个EnumHelper来获取它。

 public static class EnumHelper
    {
       public static T GetEnumAttribute<T>(Enum source)where T:Attribute
       {
           Type type = source.GetType();
           var sourceName = Enum.GetName(type, source);
           FieldInfo field = type.GetField(sourceName);
           object[] attributes = field.GetCustomAttributes(typeof (T), false);
           foreach (var o in attributes)
           {
               if (o is T)
                   return (T) o;
           }
           return null;
       }

       public static string GetDescription(Enum source)
       {
           var str = GetEnumAttribute<DescriptionAttribute>(source);
           if (str==null)
               return null;
           return str.Description;
       }

    }

 

然后我们在实例化这个枚举的时候,调用它就可以。

 public Dictionary<TableSelectedType, string> TableSelectedTypeDictionary { get; set; }
public ConboBoxEnum()
        {
            InitializeComponent();

            TableSelectedTypeDictionary=new Dictionary<TableSelectedType, string>();
            TableSelectedTypeDictionary.Add(TableSelectedType.SelectedOne, EnumHelper.GetDescription(TableSelectedType.SelectedOne));
            TableSelectedTypeDictionary.Add(TableSelectedType.SelectedTwo, EnumHelper.GetDescription(TableSelectedType.SelectedTwo));
            TableSelectedTypeDictionary.Add(TableSelectedType.SelectedThird, EnumHelper.GetDescription(TableSelectedType.SelectedThird));

            this.DataContext = this;
        }