如何检索ComboBox选择的值作为枚举类型?

时间:2011-05-26 13:39:59

标签: .net wpf enums

这是我的Enum代码:

public enum EmployeeType
{
    Manager,
    Worker
}

我将初始化ComboBox值,而表单初始化为

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

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

感谢任何帮助。

4 个答案:

答案 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#编辑器;)