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. 在端点0由GET_REPORT类请求上传报表

    目录 一般来说HID设备的报表在端点数量资源充裕的情况下都走中断端点上传,不会走控制端点即端点0上传,如果资源不足,可以利用端点0上传报表,USB协议中也是支持在端点0上传报表的. 以CH582为例, ...

  2. 错误:/etc/sudoers: syntax error near line

    错误 yang@ubuntu:/etc$ sudo cat sudoers >>> /etc/sudoers: syntax error near line 26 <<& ...

  3. docker私有镜像仓库搭建(简)

    1.装包 yum install docker-registry 2.启动服务 systemctl start docker-distribution 3.打标自己的镜像 docker tag mys ...

  4. Blender中服装网格重新拓扑实录

    最近了解到游戏行业服装的一些处理流程.简单来说: 用MD等做衣服的软件,将服装做出来: 导出2种模型:缝合好的服装模型(叫它3d)以及没有变形的平铺板片模型(叫它2d),建议导出单层的,都要带着UV, ...

  5. VirtualBox + Parrot

    安装环境:win8 1.官网下载virtualbox安装包,parrot kde sequrity镜像文件 2.用virtualbox创建新的虚拟机,内存4g,类型是linux debian 64,硬 ...

  6. postgresql 学习链接

    1.菜鸟教程:https://www.runoob.com/postgresql/postgresql-operators.html 2.易百教程:https://www.yiibai.com/pos ...

  7. 12组-Beta冲刺-总结

    组长博客链接 https://www.cnblogs.com/147258369k/p/15615820.html 一.基本情况 1.1 现场答辩总结 柯老师意见: 面向普通用户群体推出排行榜功能 增 ...

  8. python爬虫cookies jar与字典转换

    #将CookieJar转为字典: cookies = requests.utils.dict_from_cookiejar(r.cookies) #将字典转为CookieJar: cookies = ...

  9. 19_webpack_externals

    假如我们购买了CDN服务器为我们的网站的访问速度进行优化,那么我们,该如何配置 假如我的CDN为:https://mr-hou88888/cdn/那么publicPath该如何配置 1.配置publi ...

  10. Lombok Requires Annotation Processing

    当你打开一个项目启动的时候报这样的错误 这种错误 打开这个设置