问题描述
|
这是我的
Enum
代码:
public enum EmployeeType
{
Manager,Worker
}
我将初始化ComboBox
值,而窗体将自身初始化为
comboBox1.ItemsSource = Enum.GetValues(typeof(EmployeeType));
现在我想将选定的ComboBox
值检索为EmployeeType
枚举,而不是字符串或整数等。
任何帮助表示赞赏。
解决方法
EmployeeType selected = (EmployeeType)combobox1.SelectedItem;
不过,您可能想先检查是否为空(无选择)。
为了完整起见,这是我设置的示例程序。 XAML:
<Window x:Class=\"WpfApplication1.MainWindow\"
xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"
xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"
Title=\"MainWindow\" Height=\"350\" Width=\"525\">
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<ComboBox x:Name=\"_ComboBox\" />
<Button Grid.Row=\"1\" Click=\"Button_Click\" />
</Grid>
</Window>
和背后的代码:
using System;
using System.Windows;
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
_ComboBox.ItemsSource = Enum.GetValues(typeof(Whatever));
}
public enum Whatever
{
One,Two,Three,Four
}
private void Button_Click(object sender,RoutedEventArgs e)
{
if (_ComboBox.SelectedItem == null)
{
MessageBox.Show(\"No Selection\");
}
else
{
Whatever whatever = (Whatever)_ComboBox.SelectedItem;
MessageBox.Show(whatever.ToString());
}
}
}
}
,对于给定的字符串,您只需要进行相反操作即可,正确的类型是什么。
EmployeeType result =
(EmployeeType)Enum.Parse(typeof(EmployeeType),combobox1.SelectedItem.Content);
附言我不知道ѭ10是否正确,我做的WCF也不多。
,尝试这样的事情:
首先将组合框分配给GetNames方法,这将使用枚举名称而不是数字填充项目。
然后处理更改后的事件,并将字符串解析回枚举。
public enum EmployeeType
{
Manaer,Worker
}
public MainWindow()
{
InitializeComponent();
this.combobox1.ItemsSource = Enum.GetNames(typeof(EmployeeType));
this.combobox1.SelectionChanged += new SelectionChangedEventHandler(combobox1_SelectionChanged);
}
void combobox1_SelectionChanged(object sender,SelectionChangedEventArgs e)
{
EmployeeType selection = (EmployeeType)Enum.Parse(typeof(EmployeeType),(string)this.combobox1.SelectedItem);
this.ResultsTextBlock.Text = selection.ToString();
}
要添加的一件事是,您可以向每个枚举添加数据注释的Display属性,并编写一种方法来解析该枚举并显示该属性的name属性,而不是使该枚举更加用户友好。
,实际上,如果必须这样做,我会在绑定之前构建一个ObservableCollection<EmployeeType>
(例如,在视图模型的构造函数中,使用Enum.GetNames(typeof(EmployeeType))
,然后迭代每个值以将它们重新解析为EmployeeType
类型。
设置好收藏集后,只需将其绑定到ComboBox
,然后在选择一个项目时,应检索EmployeeType
类型,而不必解析它。
public class VieModel
{
private ObservableCollection<EmployeeType> _internal;
public ViewModel()
{
_internal = new ObservableCollection<EmployeeType>();
var tempList = Enum.GetNames(typeof(EmployeeType));
foreach(var val in tempList)
{
EmployeeType et = Enum.Parse(typeof(EmployeeType),val);
internal.Add(et);
}
}
public ObservableCollection<EmployeeType> EmployeeTypes
{
get { return _internal; }
}
}
然后将视图模型设置为视图的数据上下文,并将组合框绑定到EmployeeTypes
:
<ComboBox ItemsSource=\"{Binding EmployeeTypes}\" />
所选对象应返回类型为“ 5”的对象。
PS:抱歉代码拼写错误,我现在附近没有C#编辑器;)