【问题标题】:How to retrieve ComboBox selected value as enum type?如何检索 ComboBox 选定的值作为枚举类型?
【发布时间】:2026-01-04 01:15:02
【问题描述】:

这是我的Enum 代码:

public enum EmployeeType
{
    Manager,
    Worker
}

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

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

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

感谢任何帮助。

【问题讨论】:

    标签: .net wpf enums


    【解决方案1】:
    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());
                }
            }
        }
    }
    

    【讨论】:

    • 不,不会的。我在发帖前设置了一个测试项目进行确认。
    【解决方案2】:

    你只需要反过来,对于一个给定的字符串正确的类型是什么。

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

    P.S.我不知道combobox1.SelectedItem.Content是否正确,我没有做那么多WCF。

    【讨论】:

      【解决方案3】:

      试试这样的: 首先将组合框分配给 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 属性而不是枚举,使其更加用户友好。

      【讨论】:

        【解决方案4】:

        实际上,如果我不得不这样做,我会在绑定之前构建一个ObservableCollection&lt;EmployeeType&gt;(例如在您的视图模型的构造函数中,使用Enum.GetNames(typeof(EmployeeType)),然后迭代每个值以重新解析它们作为EmployeeType 类型。

        一旦您的收藏设置,您只需将其绑定到您的ComboBox然后,在选择项目时,您应该在不必解析EmployeeType而不必解析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# 编辑器;)

        【讨论】:

          最近更新 更多