zoukankan      html  css  js  c++  java
  • [转载]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;
            }
  • 相关阅读:
    使用httpVueLoader加载vue单页面不用脚手架的方法
    uniapp微信小程序登录,获取手机号,支付,分享,消息订阅功能
    uniapp UI库 uview
    vue change阻止默认事件已解决
    elementui 添加和修改使用同一个表单清除表单数据和验证!!
    uniapp 分类实现多条件筛选
    uniapp 小程序订阅消息爬坑记
    时间选择器datetimerpicker封装使用(非脚手架)
    elementui 表单(添加和修改使用同一个)重置 && 开关(关键点)
    uniapp 小程序订阅消息
  • 原文地址:https://www.cnblogs.com/fx2008/p/2423729.html
Copyright © 2011-2022 走看看