1、枚举绑定combox的ItemsSource
ItemsSource绑定的是个集合值,要想枚举绑定ItemsSource,首先应该想到的是把枚举值变成集合。

方法一:使用资源里的ObjectDataProvider
如以下枚举

public enum PeopleEnum
{
中国人,
美国人,
英国人,
俄罗斯人
}
前端绑定:

<Window x:Class="ComboxTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:ComboxTest"
mc:Ignorable="d"
Title="MainWindow" Height="200" Width="300">
<Window.Resources>
<ObjectDataProvider x:Key="peopleEnum" MethodName="GetValues" ObjectType="{x:Type local:PeopleEnum}">
<ObjectDataProvider.MethodParameters>
<x:Type Type="local:PeopleEnum"/>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</Window.Resources>
<StackPanel>
<ComboBox Margin="6" IsReadOnly="True" SelectedIndex="0" ItemsSource="{Binding Source={StaticResource peopleEnum}}"
SelectedItem="{Binding People}"></ComboBox>
<Button Margin="6" Click="show_People">显示选择项</Button>
</StackPanel>
</Window>

后端代码:

public partial class MainWindow : Window,INotifyPropertyChanged
{
    
#region 属性改变事件
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
#endregion private PeopleEnum people; public PeopleEnum People
{
get => people;
set { people = value; OnPropertyChanged("People"); }
} public MainWindow()
{
InitializeComponent();
this.DataContext = this;
} private void show_People(object sender, RoutedEventArgs e)
{
MessageBox.Show(People.ToString());
}
}

方法二:使用EnumerationExtension

有时候公司对编码有要求,比如枚举不能用中文,中文需要写到Description里。

重写一下上面的例子:

public enum PeopleEnum
{
[Description("中国人")]
CHINESE,
[Description("美国人")]
AMERICAN,
[Description("英国人")]
ENGLISHMAN,
[Description("俄罗斯人")]
RUSSIAN
}
然后写个枚举拓展的类:

public class EnumerationExtension : MarkupExtension
{
private Type _enumType; public EnumerationExtension(Type enumType)
{
if (enumType == null)
throw new ArgumentNullException("enumType"); EnumType = enumType;
} public Type EnumType
{
get { return _enumType; }
private set
{
if (_enumType == value)
return; var enumType = Nullable.GetUnderlyingType(value) ?? value; if (enumType.IsEnum == false)
throw new ArgumentException("Type must be an Enum."); _enumType = value;
}
} public override object ProvideValue(IServiceProvider serviceProvider)
{
var enumValues = Enum.GetValues(EnumType); return (
from object enumValue in enumValues
select new EnumerationMember
{
Value = enumValue,
Description = GetDescription(enumValue)
}).ToArray();
} private string GetDescription(object enumValue)
{
var descriptionAttribute = EnumType
.GetField(enumValue.ToString())
.GetCustomAttributes(typeof(DescriptionAttribute), false)
.FirstOrDefault() as DescriptionAttribute; return descriptionAttribute != null
? descriptionAttribute.Description
: enumValue.ToString();
} public class EnumerationMember
{
public string Description { get; set; }
public object Value { get; set; }
}
}

前端使用:

<ComboBox Grid.Row="0" Grid.Column="1" Margin="3" MinHeight="28"
ItemsSource="{Binding Source={local:Enumeration {x:Type local:PeopleEnum}}}"
DisplayMemberPath="Description" SelectedValue="{Binding People}" SelectedValuePath="Value">
</ComboBox>

这样写代码会简洁很多。

2、布尔值绑定combox的ItemsSource

思路是先有个对应布尔值的枚举,然后用转换器进行转换。

public enum BoolEnum
{
是,

}

public class BoolEnumConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if ((bool)value == true)
return BoolEnum.是;
else
return BoolEnum.否;
} public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if ((BoolEnum)value == BoolEnum.是)
return true;
else
return false;
}
}

前端代码:

<Window x:Class="ComboxTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:ComboxTest"
mc:Ignorable="d"
Title="MainWindow" Height="200" Width="300">
<Window.Resources>
<ObjectDataProvider x:Key="boolEnum" MethodName="GetValues" ObjectType="{x:Type local:BoolEnum}">
<ObjectDataProvider.MethodParameters>
<x:Type Type="local:BoolEnum"/>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
<local:BoolEnumConverter x:Key="boolEnumConverter" />
</Window.Resources>
<StackPanel>
<ComboBox IsReadOnly="True" Margin="6" SelectedIndex="0" ItemsSource="{Binding Source={StaticResource boolEnum}}"
SelectedItem="{Binding YesOrNo,Converter={StaticResource boolEnumConverter}}"></ComboBox>
<Button Margin="6" Click="show_result">显示选择项</Button>
</StackPanel>
</Window>

  

public partial class MainWindow : Window,INotifyPropertyChanged
{
#region 属性改变事件
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
#endregion private bool yesOrNo=true; public bool YesOrNo
{
get => yesOrNo;
set { yesOrNo = value; OnPropertyChanged("YesOrNo"); }
} public MainWindow()
{
InitializeComponent();
this.DataContext = this;
} private void show_result(object sender, RoutedEventArgs e)
{
MessageBox.Show(YesOrNo.ToString());
}
}

  

原文链接:https://blog.csdn.net/niuge8905/article/details/112647213

WPF中向下拉框中绑定枚举体的更多相关文章

  1. 在HTML中的下拉框中怎样实现超连接?

    给你个例子自己改吧: <SELECT name="select" onchange="window.open(this.options[this.selectedI ...

  2. 利用js取到下拉框中选择的值

    现在的需求是:下拉框中要是选择加盟商让其继续选择学校,要是选择平台管理员则不需要选择学校.隐藏选择下拉列表. 选择枚举值: /// <summary> /// 平台角色 /// </ ...

  3. Excel中添加下拉框

    数据->数据验证->数据验证 设置—>允许下拉框中选择序列,来源中写下拉选项,每个选项之间用逗号隔开

  4. 让下拉框中同时显示Key与Value

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  5. jquery选中将select下拉框中一项后赋值给text文本框

    jquery选中将select下拉框中一项后赋值给text文本框,出现无法将第一个下拉框的value赋值给文本框 因为select默认选中第一项..在选择第一项时,便导致无法激发onchange事件. ...

  6. 快速解决js开发下拉框中blur与click冲突

    在开发中我们会经常遇到blur和click冲突的情况.下面叙述了开发中常遇到的"下拉框"的问题,并提供了两种解决方案. 一.blur和click事件简述 blur事件:当元素失去焦 ...

  7. 选择屏幕中的下拉框和dialog中下拉框设计

    REPORT  YTEST014. PARAMETERS: auart LIKE vapma-auart  AS LISTBOX   VISIBLE LENGTH 6. AT SELECTION-SC ...

  8. JavaScript向select下拉框中加入和删除元素

    JavaScript向select下拉框中加入和删除元素 1.说明 a   利用append()方法向下拉框中加入元素 b   利用remove()方法移除下拉框中最后一个元素 2.设计源代码 < ...

  9. Ajax实现在textbox中输入内容,动态从数据库中模糊查询显示到下拉框中

    功能:在textbox中输入内容,动态从数据库模糊查询显示到下拉框中,以供选择 1.建立一aspx页面,html代码 <HTML> <HEAD> <title>We ...

  10. JavaScript向select下拉框中添加和删除元素

    JavaScript向select下拉框中添加和删除元素 1.说明 a   利用append()方法向下拉框中添加元素 b   利用remove()方法移除下拉框中最后一个元素 2.设计源码 < ...

随机推荐

  1. 《Toward Fast, Flexible, and Robust Low-Light Image Enhancement》

    1.(23条消息) 图像增强评价标准EME和matlab代码_eme指标_zhonglingyuxiuYYX的博客-CSDN博客 2.nn.moduleList 3.LOE:lightness ord ...

  2. linux下生成证书

    1.生成私有证书 # 生成需要密码的密钥文件server.key openssl genrsa -des3 -out server.key 2048 # 转成不用密码的rsa密钥文件 openssl ...

  3. 【杂项】瞎玩——suhr RIOT单块制作流程

    难得的周末,在家上课似乎丝毫没有轻松多少,然而专业课任务的ddl远在天边,上午赶赶进度似乎稍微闲下来了点,正好前几天找电路的时候看到一个非常nice的效果器制作网站,国内少有深入研究效果器电路的文章, ...

  4. CCF 201909-1 小明种苹果

    #include <iostream> #include <bits/stdc++.h> #include <string> using namespace std ...

  5. 代替宝塔的webmin搭建

    webmin官网 对于IBM的服务器,cpu架构不同于常见的x86或aarch64,部分第三方软件是无法正常安装的,比如大名鼎鼎的宝塔面板,对于像我一样的新手很不友好,这里分享一款代替宝塔的web管理 ...

  6. vue ref用法

    <div class="myClass" ref="diva"></div> // 给dom节点添加ref this.$refs.div ...

  7. vue获取标签对象的方式

    我知道2种方式: 1.在标签内 使用 ref 属性定义对象名,使用this.$refs.[name] 调用 2.在标签内 使用 函数传递事件对象, 定义, <div @click="h ...

  8. VSCode+EIDE开发CH32V系列RISC-V MCU

    VSCode+EIDE开发CH32V系列RISC-V MCU 1. VS Code Visual Studion Code (VS Code),是一款由微软开发且跨平台的免费源代码编辑器.该软件支持语 ...

  9. 删除 gnome自带的Videos软件

    gnome3自带的Videos粗看感觉听简洁挺流畅的,可是细看不仅电影中文名乱码显示还搞得字幕慢半拍,这一点完全不能忍,太难受了. 还是Vlc牛.而且Videos在应用商店不能卸载,命令行搜索已安装软 ...

  10. -bash: nslookup: 未找到命令;centos7 安装nslookup

    一.安装服务 [root@localhost ~]# yum -y install bind-utils 二.查看 [root@localhost ~]# nslookup