概述

本文讲述下拉框和枚举类型进行绑定的一些操作。

下拉框的基本操作

设计部分:

        <ComboBox ItemsSource="{Binding Fruits}"
SelectedItem="{Binding SelectedFruit}"
SelectedIndex="{Binding SelectedIndex}"/>

代码部分:

        public List<string> Fruits { get; set; } = new List<string> { "Apple","Bonana", "Strawberry" };
public string SelectedFruit { get; set; }
public int SelectedIndex { get; set; }

以上是最简单的一种绑定形式,采用字符串列表作为数据源。虽然SelectedItem和SelectedIndex都可以用来控制或获取选择项,但建议还是使用SelectedItem比较合适,因为下拉框的数据是可以绑定任意对象列表的,通过SelectedItem就可以直接获取到对象。注意用于绑定的对象应重写ToString()方法。

下拉框绑定枚举类型

首先我们定义一个枚举类型

    public enum AlarmLevel
{
Normal = 0,
Warring = 1,
Error = 2,
}

然后定义要绑定的源:

        public List<AlarmLevel> Fruits { get; set; } = new List<AlarmLevel> { AlarmLevel.Normal, AlarmLevel.Warring, AlarmLevel.Error };
public AlarmLevel SelectedFruit { get; set; }

设计端代码:

        <ComboBox ItemsSource="{Binding Fruits}"
SelectedItem="{Binding SelectedFruit}"/>

这样就实现绑定了。但初始化枚举对象列表的代码有点麻烦,我们需要优化一下。

新建一个辅助类

    public class EnumHelper<T>
{
public static List<T> ToList()
{
return Enum.GetValues(typeof(T)).Cast<T>().ToList();
}
}

初始化代码就可以简化为下面形式:

public List<AlarmLevel> Fruits = EnumHelper<AlarmLevel>.ToList();

这个代码对所有枚举类型都适用。

下拉框中文字显示枚举的描述信息

有时候我们希望下拉框显示的内容和枚举项的定义名称并不一致,比如定义项为“Normal”,界面显示“正常”,这个要求也是可以实现的。下面代码实现界面显示枚举项的Description值。

定义枚举类对象,如下:

    public enum AlarmLevel
{
[Description("正常")]
Normal = 0, [Description("警报")]
Warring = 1, [Description("故障")]
Error = 2,
}

ViewModel中代码不变,我们要增加一个转换器来实现这个功能

    public class EnumDescriptionConverter : IValueConverter
{
object IValueConverter.Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
Enum myEnum = (Enum)value;
string description = GetEnumDescription(myEnum);
return description;
} object IValueConverter.ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return string.Empty;
} private string GetEnumDescription(Enum enumObj)
{
FieldInfo fieldInfo = enumObj.GetType().GetField(enumObj.ToString()); object[] attribArray = fieldInfo.GetCustomAttributes(false); if (attribArray.Length == 0)
{
return enumObj.ToString();
}
else
{
DescriptionAttribute attrib = attribArray[0] as DescriptionAttribute;
return attrib.Description;
}
}
}

前端代码修改如下:

<UserControl x:Class="LearnWPF.Pages.PageComboBoxView"
xmlns:util="clr-namespace:LearnWPF.Utils"> <UserControl.Resources>
<util:EnumDescriptionConverter x:Key="enumDescriptionConverter" />
</UserControl.Resources> <Canvas>
<ComboBox ItemsSource="{Binding AlarmLevelList}"
SelectedItem="{Binding SelectedAlarmLevel}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Converter={StaticResource enumDescriptionConverter}}" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</Canvas>
</UserControl>

这里稍微分析一下转换器。

这里的转换器必须继承于IValueConverter接口,它有Convert和ConvertBack两个方法。以Convert为例,其输入是一个object,来源是ItemTemplate模板的当前对象,输出也是一个对象,ItemTemplate会用输出的对象代替原来的对象。

自定义的输出的对象应重写ToString()方法。

以上转换器的设计是将枚举对象转换为其Description特性,实际应用时可能需要考虑国际化的需求,其转换数据的来源也不一定要从Description取值,完全可以根据需要另行设计。

资源

系列目录:WPF开发快速入门【0】前言与目录

代码下载:Learn WPF: WPF学习笔记 (gitee.com)

WPF开发快速入门【6】下拉框与枚举类型的更多相关文章

  1. WPF开发快速入门【7】WPF的拖放功能(Drag and Drop)

    概述 本文描述WPF的拖放功能(Drag and Drop). 拖放功能涉及到两个功能,一个就是拖,一个是放.拖放可以发生在两个控件之间,也可以在一个控件自己内部拖放.假设界面上有两个控件,一个Tre ...

  2. 快速设计ComboBox下拉框

    传统软件项目开发时,需要每个控件一个一个的来设计,同时需要在页面功能中对每个控件的属性进行判定处理,尤其是页面风格布局样式需要花去一大半的时间,并且后续要想修改是非常麻烦繁琐,这样就导致设计完成一个功 ...

  3. vue开发 element的select下拉框设定初值后,不能重新选择的问题

    问题描述: 用的element的select可多选的下拉选框,在回显后有初始值的情况下,不能修改,也不能再选择 如图,明明点击了一般内勤主管,但没有任何反应 <el-select v-model ...

  4. element select下拉框绑定number类型

    vue 开发中element-ui库的switch开关绑定number类型数据不成功问题 解决方法

  5. 安卓PopupWindow+ListView实现登录账号选择下拉框

    这段时间在做android开发,发现自定义下拉框有很多种方法实现,我介绍一种PopupWindow+ListView的方式,实现起来比较灵活.效果: 直接看核心代码: //获取文本框 etLoginN ...

  6. 非常实用的select下拉框-Select2.js

    在Web开发中,Select下拉框是常用的输入组件.由于原生的Select几乎很难通过CSS样式控制.一些好看的Select下拉框就只能通过模拟来实现.PHP程序员雷雪松给大家推荐一筐款不错的Sele ...

  7. ops-web运维平台-create.jsp-mootools下拉框-复选框

    create.jsp页面的,body部分 <body onload="Page.init('${pageError}','${pageMessage}',${isSubmit},tru ...

  8. datagrid在MVC中的运用05-加入时间搜索条件,枚举填充下拉框

    本文主要来体验在搜索区域增加更多的搜索条件,主要包括: ※ 使用jQuery ui的datepicker显示时间,设置显示格式.样式. ※ 设置jQuery ui的onClose事件,使开始和结束时间 ...

  9. 使用jquery Ajax异步刷新 下拉框

    一个下拉框 <label>产品类型:</label> <select id="protype" name="protype" on ...

  10. Android Spinner 下拉框简单应用 详细注解

    目录 Android Spinner 代码部分 Spinner代码介绍 核心代码 说在最后 @ Android Spinner Spinner 提供下拉列表式的输入方式,该方法可以有效节省手机屏幕上的 ...

随机推荐

  1. 第十五篇:JavaScript 之 Dom操作

    一.后台管理页面布局 主站布局 <div class="pg-header"></div> <div style="width:980px; ...

  2. B端架构升级之路

    一.背景 随着B端业务快速发展,系统愈趋复杂.我们发起了B端架构升级专项,基于B端业务的特点,从研发规范建设.B端架构基建.系统架构升级和落地保障等多方面提升了B端的架构水平. 二.升级思路 架构是一 ...

  3. 树模型-C4.5

    C4.5: ID3的改进版本 首先,C4.5和ID3一样都是多叉树,重点是连续特征处理+特征选择的方式不同. ID3算法存在的不足, 在C4.5里面有了改进 有那些改进 不能处理连续特征的问题 C4. ...

  4. mysql 必知必会整理—存储过程[十三]

    前言 简单整理一下存储过程. 正文 需要MySQL 5 MySQL 5添加了对存储过程的支持,因此,本章内容适用于MySQL 5及以后的版本. 迄今为止,使用的大多数SQL语句都是针对一个或多个表的单 ...

  5. python3中os.renames()和os.rename()区别

    renames源码:def renames(old, new): head, tail = path.split(new) # 作用是分割为两部分,head为路径,tail为文件名: if head ...

  6. 一个简单docker服务镜像的制作,手把手教你制作一个flask的docker容器服务镜像。

    OK,docker的安装就不多说了.(自己去搜吧) 下面开始讲如何制作镜像: 1.pull拉取一个centos镜像,随意拉取,可以是ubuntu sudo docker pull centos:7 2 ...

  7. 力扣414(java)-第三大的数(简单)

    题目: 给你一个非空数组,返回此数组中 第三大的数 .如果不存在,则返回数组中最大的数. 示例 1: 输入:[3, 2, 1]输出:1解释:第三大的数是 1 .示例 2: 输入:[1, 2]输出:2解 ...

  8. 揭秘 RocketMQ 新特性以及在金融场景下的实践

    2019 年末, RocketMQ 正式发布了 4.6.0 版本,增加了" Request-Reply "的同步调用的新特性." Request-Reply " ...

  9. Java依赖冲突高效解决之道

    ​简介:由于阿里妈妈联盟团队负责业务的特殊性,系统有庞大的对外依赖,依赖集团六七十个团队服务及N多工具组件,通过此文和大家分享一下我们积累的一些复杂依赖有效治理的经验,除了简单技术技巧的总结外,也会探 ...

  10. WPF 在 .NET Core 3.1.19 版本 触摸笔迹偏移问题

    在更新到 .NET 6 发布之前的,在 2021.11.02 的 .NET Core 版本,都会存在此问题.在 WPF 应用里面,如果在高 DPI 下,进行触摸书写,此时的笔迹将会偏移.核心原因是在这 ...