概述
本文讲述下拉框和枚举类型进行绑定的一些操作。
下拉框的基本操作
设计部分:- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/><ComboBox ItemsSource="{Binding Fruits}"
- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> SelectedItem="{Binding SelectedFruit}"
- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> SelectedIndex="{Binding SelectedIndex}"/>
复制代码 代码部分:- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/><ComboBox ItemsSource="{Binding Fruits}"
- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> SelectedItem="{Binding SelectedFruit}"
- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> SelectedIndex="{Binding SelectedIndex}"/>public List Fruits { get; set; } = new List { "Apple","Bonana", "Strawberry" }; <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/><ComboBox ItemsSource="{Binding Fruits}"
- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> SelectedItem="{Binding SelectedFruit}"
- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> SelectedIndex="{Binding SelectedIndex}"/>public string SelectedFruit { get; set; } <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/><ComboBox ItemsSource="{Binding Fruits}"
- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> SelectedItem="{Binding SelectedFruit}"
- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> SelectedIndex="{Binding SelectedIndex}"/>public int SelectedIndex { get; set; }
复制代码 以上是最简单的一种绑定形式,采用字符串列表作为数据源。虽然SelectedItem和SelectedIndex都可以用来控制或获取选择项,但建议还是使用SelectedItem比较合适,因为下拉框的数据是可以绑定任意对象列表的,通过SelectedItem就可以直接获取到对象。注意用于绑定的对象应重写ToString()方法。
下拉框绑定枚举类型
首先我们定义一个枚举类型 - public enum AlarmLevel { <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/><ComboBox ItemsSource="{Binding Fruits}"
- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> SelectedItem="{Binding SelectedFruit}"
- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> SelectedIndex="{Binding SelectedIndex}"/> Normal = 0, <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/><ComboBox ItemsSource="{Binding Fruits}"
- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> SelectedItem="{Binding SelectedFruit}"
- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> SelectedIndex="{Binding SelectedIndex}"/> Warring = 1, <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/><ComboBox ItemsSource="{Binding Fruits}"
- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> SelectedItem="{Binding SelectedFruit}"
- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> SelectedIndex="{Binding SelectedIndex}"/> Error = 2, }
复制代码 然后定义要绑定的源:- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/><ComboBox ItemsSource="{Binding Fruits}"
- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> SelectedItem="{Binding SelectedFruit}"
- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> SelectedIndex="{Binding SelectedIndex}"/>public List Fruits { get; set; } = new List { AlarmLevel.Normal, AlarmLevel.Warring, AlarmLevel.Error }; <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/><ComboBox ItemsSource="{Binding Fruits}"
- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> SelectedItem="{Binding SelectedFruit}"
- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> SelectedIndex="{Binding SelectedIndex}"/>public AlarmLevel SelectedFruit { get; set; }
复制代码 设计端代码:- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/><ComboBox ItemsSource="{Binding Fruits}"
- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> SelectedItem="{Binding SelectedFruit}"
- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> SelectedIndex="{Binding SelectedIndex}"/>
复制代码 这样就实现绑定了。但初始化枚举对象列表的代码有点麻烦,我们需要优化一下。
新建一个辅助类- public class EnumHelper { <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/><ComboBox ItemsSource="{Binding Fruits}"
- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> SelectedItem="{Binding SelectedFruit}"
- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> SelectedIndex="{Binding SelectedIndex}"/>public static List ToList() <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/><ComboBox ItemsSource="{Binding Fruits}"
- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> SelectedItem="{Binding SelectedFruit}"
- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> SelectedIndex="{Binding SelectedIndex}"/>{ <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/><ComboBox ItemsSource="{Binding Fruits}"
- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> SelectedItem="{Binding SelectedFruit}"
- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> SelectedIndex="{Binding SelectedIndex}"/> return Enum.GetValues(typeof(T)).Cast().ToList(); <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/><ComboBox ItemsSource="{Binding Fruits}"
- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> SelectedItem="{Binding SelectedFruit}"
- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> SelectedIndex="{Binding SelectedIndex}"/>} }
复制代码 初始化代码就可以简化为下面形式:- public List<AlarmLevel> Fruits = EnumHelper<AlarmLevel>.ToList();
复制代码 这个代码对所有枚举类型都适用。
下拉框中文字显示枚举的描述信息
有时候我们希望下拉框显示的内容和枚举项的定义名称并不一致,比如定义项为“Normal”,界面显示“正常”,这个要求也是可以实现的。下面代码实现界面显示枚举项的Description值。
定义枚举类对象,如下:- public enum AlarmLevel { <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/><ComboBox ItemsSource="{Binding Fruits}"
- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> SelectedItem="{Binding SelectedFruit}"
- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> SelectedIndex="{Binding SelectedIndex}"/>[Description("正常")] <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/><ComboBox ItemsSource="{Binding Fruits}"
- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> SelectedItem="{Binding SelectedFruit}"
- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> SelectedIndex="{Binding SelectedIndex}"/>Normal = 0, <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/><ComboBox ItemsSource="{Binding Fruits}"
- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> SelectedItem="{Binding SelectedFruit}"
- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> SelectedIndex="{Binding SelectedIndex}"/>[Description("警报")] <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/><ComboBox ItemsSource="{Binding Fruits}"
- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> SelectedItem="{Binding SelectedFruit}"
- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> SelectedIndex="{Binding SelectedIndex}"/>Warring = 1, <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/><ComboBox ItemsSource="{Binding Fruits}"
- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> SelectedItem="{Binding SelectedFruit}"
- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> SelectedIndex="{Binding SelectedIndex}"/>[Description("故障")] <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/><ComboBox ItemsSource="{Binding Fruits}"
- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> SelectedItem="{Binding SelectedFruit}"
- <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> <ComboBox ItemsSource="{Binding Fruits}"
- SelectedItem="{Binding SelectedFruit}"/> SelectedIndex="{Binding SelectedIndex}"/>Error = 2, }
复制代码 ViewModel中代码不变,我们要增加一个转换器来实现这个功能
 View Code 前端代码修改如下: 这里稍微分析一下转换器。
这里的转换器必须继承于IValueConverter接口,它有Convert和ConvertBack两个方法。以Convert为例,其输入是一个object,来源是ItemTemplate模板的当前对象,输出也是一个对象,ItemTemplate会用输出的对象代替原来的对象。
自定义的输出的对象应重写ToString()方法。
以上转换器的设计是将枚举对象转换为其Description特性,实际应用时可能需要考虑国际化的需求,其转换数据的来源也不一定要从Description取值,完全可以根据需要另行设计。
资源
系列目录:WPF开发快速入门【0】前言与目录
代码下载:Learn WPF: WPF学习笔记 (gitee.com)
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |