Enum Binding ItemsSource In WPF


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).

  
代码

xaml中:

  
代码

效果:

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;
        }
posted @   长白山  阅读(204)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
点击右上角即可分享
微信分享提示