WPF DataGridComboBoxColumn динамическая привязка Enum

У меня есть сетка данных, для которой я установил источник элемента List<User>. Одним из свойств пользователя является Department, который является перечислением с описаниями.

В сетке данных Отделы отображаются в виде поля со списком, чтобы пользователь мог выбрать один. Мне нужно привязать значение и описание перечисления к DataGridComboBoxColumn.

Пока мне удалось либо привязать Enum к DataGridComboBoxColumn.ItemsSource, и он работает, но описание не принимается во внимание. Или установите для набора Value, Description значение DataGridComboBoxColumn.ItemsSource и установите DisplayMemberPath, SelectedValuePath. Но в этом случае значение не привязывается к DataGridComboBoxColumn.

Вид:

 <DataGrid x:Name="userData" HorizontalAlignment="Stretch" Margin="10,157,10,80" VerticalAlignment="Stretch" Height="Auto" Width="Auto"
 AutoGeneratingColumn="UserData_OnAutoGeneratingColumn" DisplayMemberPath="Description"/>

Код:

    private void UserData_OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
    {
        if (e.Column.SortMemberPath == "Department")
        {
            (e.Column as DataGridComboBoxColumn).ItemsSource = EnumExtension.ProvideValue();

            (e.Column as DataGridComboBoxColumn).DisplayMemberPath = "Description";
            (e.Column as DataGridComboBoxColumn).SelectedValueBinding = new Binding("Value");
            (e.Column as DataGridComboBoxColumn).SelectedValuePath = "Value";
        }
    }

Расширение перечисления:

public static class EnumExtension
{
    public static List<ValueDescriptionVm<Departments>> ProvideValue()
    {
        return Enum.GetValues(typeof(Departments))
        .Cast<object>()
        .Select(enumValue => new ValueDescriptionVm<Departments>()
        {
            Value = (Departments)enumValue,
            Description = GetDescription((Enum)enumValue)
        }).ToList();
    }

    private static string GetDescription(Enum enumValue)
    {
        FieldInfo fi = enumValue.GetType().GetField(enumValue.ToString());
        var attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);

        if (attributes.Length > 0)
        {
            return attributes[0].Description;
        }

        return enumValue.ToString();
    }
}

person Dan Kononenko    schedule 14.08.2017    source источник
comment
Я задал аналогичный вопрос здесь, ссылка, надеюсь, это поможет   -  person stuicidle    schedule 15.08.2017
comment
@stuicidle Что такое ComboBoxSelectedItem в .SelectedValueBinding = ComboBoxSelectedItem? (Коллекция Описание, Значение)?   -  person Dan Kononenko    schedule 15.08.2017
comment
В примере это объект ComboBoxOption, который обновляется, когда вы делаете выбор из поля со списком.   -  person stuicidle    schedule 15.08.2017
comment
Я обновил свой пост, надеюсь, он будет иметь немного больше смысла, если у вас все еще есть трудности :)   -  person stuicidle    schedule 16.08.2017


Ответы (1)


Путь к SelectedValueBinding должен быть именем свойства класса User:

(e.Column as DataGridComboBoxColumn).SelectedValueBinding = new Binding("Department");

Тогда привязка должна работать при условии, что тип свойства Department класса User и свойства Value класса ValueDescriptionVm<Departments> совпадает.

person mm8    schedule 15.08.2017