Как получить выбранное значение ComboBox как тип enum? - PullRequest
0 голосов
/ 26 мая 2011

Это мой Enum код:

public enum EmployeeType
{
    Manager,
    Worker
}

Я инициализирую ComboBox значения, а форма инициализируется как

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

Теперь я хочу получить выбранное значениеComboBox как EmployeeType перечисление, а не как строка или целое число и т. Д.

Любая помощь приветствуется.

Ответы [ 4 ]

11 голосов
/ 26 мая 2011
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());
            }
        }
    }
}
0 голосов
/ 26 мая 2011

На самом деле, если бы мне пришлось это сделать, я бы построил 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 #;)

0 голосов
/ 26 мая 2011

Попробуйте что-то вроде этого: сначала назначьте поле со списком методу 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();
    }

Одна вещь, которую нужно добавить, - это добавить атрибут отображения аннотации данных к каждому перечислению и написать метод, который будет анализировать перечисление иотображать свойство name атрибута, а не enum, делая его более удобным для пользователя.

0 голосов
/ 26 мая 2011

Вам просто нужно сделать обратное, для данной строки , что такое правильный тип .

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

P.S. Я не знаю, правильно ли combobox1.SelectedItem.Content, я не делаю так много WCF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...