这是我的Enum
代码:
public enum EmployeeType
{
Manager,
Worker
}
我将初始化ComboBox
值,而表单初始化为
combobox1.ItemsSource = Enum.GetValues(typeof(EmployeeType));
现在我想将ComboBox
的选定值检索为EmployeeType
枚举,而不是字符串或整数等。
感谢任何帮助。
答案 0 :(得分:11)
EmployeeType selected = (EmployeeType)combobox1.SelectedItem;
您可能希望首先检查null(无选择)。
为了完整起见,这是我设置的示例程序。 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());
}
}
}
}
答案 1 :(得分:0)
你需要反过来,对于给定字符串,正确类型是什么。
EmployeeType result =
(EmployeeType)Enum.Parse(typeof(EmployeeType),
combobox1.SelectedItem.Content);
P.S。我不知道combobox1.SelectedItem.Content
是否正确,我没有做那么多WCF。
答案 2 :(得分:0)
尝试这样的事情: 首先将组合框分配给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属性而不是enum,使其更加用户友好。
答案 3 :(得分:-1)
实际上,如果我必须这样做,我会先在绑定中构建一个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}" />
所选内容应返回EmployeeType
类型的对象。
PS:很抱歉代码拼写错误,我现在附近没有任何C#编辑器;)