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}}"/>
效果图:

但是有时候,我们要绑定的是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}}"/>
效果:

二、通过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中的类型。
效果还是一样。 
三、通过特性(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;
}
Enum Binding ItemsSource In WPF的更多相关文章
- Listbox Binding ItemsSource
把List<CourseItem>绑定到ListBox. 前台绑定: <ListBox x:Name="ItemBox" Grid.Row="1&quo ...
- Impossible WPF Part 2: Binding Expressions
原文 http://www.11011.net/wpf-binding-expressions Back in April I posted an idea for building an expre ...
- WPF自学入门(七)WPF 初识Binding
今天记录一下Binding的基础和具体的使用方法,说起这个Binding,在WPF中,Binding是很重要的特征,在传统的Windows软件来看,大多数都是UI驱动程序的模式,也可以说事件驱动程序, ...
- WPF Binding ElementName方式无效的解决方法--x:Reference绑定
原文:WPF Binding ElementName方式无效的解决方法--x:Reference绑定 需求: 背景:Grid的有一个TextBlock name:T1和一个ListBox,ListBo ...
- WPF自定义控件与样式(8)-ComboBox与自定义多选控件MultComboBox
一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要内容: 下拉选 ...
- WPF仿Word头部格式,涉及DEV RibbonControl,NarvbarControl,ContentPresenter,Navigation
时隔1个月,2015/06/17走进新的环境. 最近一个星期在学习仿Word菜单栏的WPF实现方式,废话不多说,先看一下效果. 打开界面后,默认选中[市场A],A对应的菜单栏,如上图, 选择[市场B] ...
- WPF快速精通版
命名空间: xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:local="clr-namespace:U ...
- WPF DataGrid显格式
Guide to WPF DataGrid formatting using bindings Peter Huber SG, 25 Nov 2013 CPOL 4.83 (13 votes) ...
- 【转】WPF自定义控件与样式(8)-ComboBox与自定义多选控件MultComboBox
一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等. 本文主要内容: 下拉选择控件ComboBox的自定义样式及扩展: 自定义多选控件Mul ...
随机推荐
- ThinkPHP的join方法
两张表: 表一:pre_company_member 关联字段:comp_id 表二:pre_company 关联字段:comp_id 查询这两表中的数据. 方法一:驼峰法 $member=M('C ...
- 2014牡丹江——Known Notation
题目链接 题意: 输入一个长度不超过1000的字符串,包含数字(1-9)和星号(*).字符串中的空格已经丢失,所以连起来的数字串能够看成很多分开的数.也能够看成连续的数,即能够随意加入空格. 如今有两 ...
- ubuntu安装deb文件
install the deb-package, e.g. using the Terminal command$ sudo apt install <path-to-smartgit-deb- ...
- CoreThink主题开发(九)使用H-ui开发博客主题之用户个人主页
感谢H-ui.感谢CoreThink! 效果图: 这里使用table布局 /Theme/Blog/User/Index/home.html <extend name="$_home_ ...
- Numpy用于数组的文件输入输出
这一章比较简单,内容也比较少.而且对于文件的读写,还是使用pandas比较好.numpy主要是读写文本数据和二进制数据的. 将数组以二进制的格式保存到硬盘上 主要的函数有numpy.save和nump ...
- 光标定位 + commonAncestor
self.cmd.range.setStartBefore().collapse(true) self.cmd.select() 通过dom节点设置range的范围 <h1>conte ...
- range开始节点和结束节点
sc = range.startContainer, so = range.startOffsest ec = range.endContainer, eo=range.endOffset sta ...
- lambda可调用对象
//find_if谓词使用 bool isShorter(const string &s1, const string &sz){ return s1.size() < sz.s ...
- C++ IPv4与IPv6的兼容编码(转,出自http://blog.csdn.net/ligt0610/article/details/18667595)
这里不再对IPv6 socket相关编程的基础知识进行讲解,只提供一个IP协议无关的服务端和客户端的代码,仅供参考. 服务端代码: #include <iostream> #include ...
- 【Head First Servlets and JSP】笔记6:什么是响应首部 & 快速搭建一个简单的测试环境
搭建简单的测试环境 什么是响应首部 最简单的响应首部——Content-Type 设置响应首部 请求重定向与响应首部 在浏览器中查看Response Headers 1.先快速搭建一个简单的测试环境, ...