Enum Binding ItemsSource In WPF

在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;

        }

你可能感兴趣的:(source)