WPF DataGridComboBoxColumn 枚举的动态绑定

WPF DataGridComboBoxColumn dynamic binding of Enum

我有一个数据网格,我在其中设置了项目源 List<User>。 User 的属性之一是 Department,它是带有描述的枚举。

在数据网格中,部门显示为用户的组合框 select 一个。 我需要将枚举值和描述绑定到 DataGridComboBoxColumn.

到目前为止,我设法将 Enum 绑定到 DataGridComboBoxColumn.ItemsSource 因此它可以工作,但没有考虑到描述。 或将Value、Description的集合设置为DataGridComboBoxColumn.ItemsSource并设置DisplayMemberPathSelectedValuePath。但在这种情况下,该值未绑定到 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();
    }
}

SelectedValueBinding 的路径应该是 User 属性 的名称 class:

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

如果 Department 属性 的 User class 和 Value 属性 的类型,则绑定应该可以工作的 ValueDescriptionVm<Departments> class 是一样的。