概述

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

下拉框的基本操作

设计部分:

        <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. 一种提升深度多视角行人检测的泛化性能的方法 Bringing Generalization to Deep Multi-View Pedestrian Detection

    一种提升深度多视角行人检测的泛化性能的方法 Bringing Generalization to Deep Multi-View Pedestrian Detection 论文url: https:/ ...

  2. 混合app 解决常见bug弹出键盘返回出现闪屏

    前言 在我们开发混合app中,我们会发现一个问题,那就是比如我们正在输入信息的时候,然后我们按导航的返回键返回,因为切页面和回收键盘是同时的,给人一种闪屏的感觉,那么怎么解决呢? 方案 以ionic为 ...

  3. 前端使用 Konva 实现可视化设计器(6)

    请大家动动小手,给我一个免费的 Star 吧~ 这一章处理一下复制.粘贴.删除.画布归位.层次调整,通过右键菜单控制. github源码 gitee源码 示例地址 复制粘贴 复制粘贴(通过快捷键) / ...

  4. 力扣49(java)-字母异位词分组(中等)

    题目: 给你一个字符串数组,请你将 字母异位词 组合在一起.可以按任意顺序返回结果列表. 字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次. 示例 1: 输入: ...

  5. 技术解读:现代化工具链在大规模 C++ 项目中的运用 | 龙蜥技术

    简介: 本文详细介绍我们在实际工作中的大型 C++ 项目中现代化工具链的实践以及结果. 编者按:C++ 语言与编译器一直都在持续演进,出现了许多令人振奋的新特性,同时还有许多新特性在孵化阶.除此之外, ...

  6. 在线运行代码的 PHP 沙盒环境实现

      演示: 多版本PHP运行代码 作用: 方便作为独立的调试环境运行 一些 临时逻辑,查看执行结果. 方便比较不同版本的 PHP 执行差异,进行一般的兼容性测试. 思路: Docker镜像构建多个PH ...

  7. [FAQ] Cordova 模拟器中不能访问域名, 未联网 ?

    首先保证电脑已联网,然后打开模拟器的浏览器输入常用网址,看看是否能够联网. 如果访问失败,在本机中在 cmd 中 ping www.baidu.com 获得百度的ip地址,然后在浏览器中输入 http ...

  8. dotnet core 3.1 将 UWP 控件嵌入到 WPF 应用 收到 UIA 消息主线程卡住

    本文记录一个问题,此问题是在 .NET Core 3.1 的 WPF 应用里面,嵌入 UWP 控件之后,在收到 UIA 的消息时,可能让主线程卡住.暂时此问题还不知道具体的复现步骤,此问题预计和 WP ...

  9. Windows 对全屏应用的优化

    全屏应用对应的是窗口模式应用,全屏应用指的是整个屏幕都是被咱一个应用独占了,屏幕上没有显示其他的应用,此时的应用就叫全屏应用.如希沃白板这个程序.本文主要告诉大家从微软官方的文档以及考古了解到的 Wi ...

  10. 《最新出炉》系列入门篇-Python+Playwright自动化测试-41-录制视频

    1.简介 上一篇讲解和分享了录制自动生成脚本,索性连带录制视频也一股脑的在这里就讲解和分享了.今天我们将学习如何使用Playwright和Python来录制浏览器操作的视频,以便在需要时进行回放和分析 ...