WPF中向下拉框中绑定枚举体
1、枚举绑定combox的ItemsSource
ItemsSource绑定的是个集合值,要想枚举绑定ItemsSource,首先应该想到的是把枚举值变成集合。
方法一:使用资源里的ObjectDataProvider
如以下枚举
public enum PeopleEnum
{
中国人,
美国人,
英国人,
俄罗斯人
}
前端绑定:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <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> |
后端代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | 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
}
然后写个枚举拓展的类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | 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 ; } } } |
前端使用:
1 2 3 4 | <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
{
是,
否
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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 ; } } |
前端代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <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> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | 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
分类:
WinForm,WPF
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY