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>
класс такой же.