У меня есть сетка данных, для которой я установил источник элемента 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();
}
}