WPF DataGridComboBoxColumn динамическое связывание Enum

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

В таблице данных отделы отображаются в виде выпадающего списка, чтобы пользователь мог выбрать один из них. Мне нужно привязать значение и описание enum к 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";
        }
    }

Расширение enum:

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

1 ответ

Решение

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

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

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

Другие вопросы по тегам