2011-05-26 110 views
0

这是我的Enum代码:如何检索组合框选定值作为枚举类型?

public enum EmployeeType 
{ 
    Manager, 
    Worker 
} 

我将初始化ComboBox值,而形式初始化本身作为

combobox1.ItemsSource = Enum.GetValues(typeof(EmployeeType)); 

现在我想要检索的ComboBox选择的值作为EmployeeType枚举,而不是作为字符串或整数等

任何帮助表示赞赏。

回答

0

你只需要做相反的事情,对于给定字符串的,什么是正确类型

EmployeeType result = 
      (EmployeeType)Enum.Parse(typeof(EmployeeType), 
      combobox1.SelectedItem.Content); 

P.S.我不知道如果combobox1.SelectedItem.Content是正确的,我不会做那么多的WCF。

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()); 
      } 
     } 
    } 
} 
+0

这将抛出一个错误......你需要使用'Enum.Parse' – balexandre 2011-05-26 13:45:51

+2

没有它赢得“T。我建立了一个测试项目,在我发布之前进行确认。 – Tim 2011-05-26 13:49:45

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(); 
    } 

有一点需要补充的是,您可以将数据注释显示属性添加到每个枚举,并编写将解析枚举并显示属性的名称属性,而不是使之更人性化的枚举的方法。

0

其实,如果我必须这样做,我就已经建立了一个ObservableCollection<EmployeeType>以前的绑定(用于为例在您的视图模型的构造,使用Enum.GetNames(typeof(EmployeeType)),然后遍历每个值重新分析他们作为EmployeeType类型。

一旦您的收藏成立,你就必须将其绑定到你的ComboBox,然后选择项目的时候,你应该retreive一种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; } 
    } 
} 

然后将视图模型设置为d您的组合框结合EmployeeTypes视图的ATA上下文,并且:

<ComboBox ItemsSource="{Binding EmployeeTypes}" /> 

选定应返回EmployeeType类型的对象。

PS:抱歉代码拼写错误,我没有在我身边的任何C#编辑器现在;)