WPF DataGridComboBoxColumn 枚举的动态绑定
WPF DataGridComboBoxColumn dynamic binding of Enum
我有一个数据网格,我在其中设置了项目源 List<User>
。
User 的属性之一是 Department
,它是带有描述的枚举。
在数据网格中,部门显示为用户的组合框 select 一个。
我需要将枚举值和描述绑定到 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();
}
}
SelectedValueBinding
的路径应该是 User
属性 的名称 class:
(e.Column as DataGridComboBoxColumn).SelectedValueBinding = new Binding("Department");
如果 Department
属性 的 User
class 和 Value
属性 的类型,则绑定应该可以工作的 ValueDescriptionVm<Departments>
class 是一样的。
我有一个数据网格,我在其中设置了项目源 List<User>
。
User 的属性之一是 Department
,它是带有描述的枚举。
在数据网格中,部门显示为用户的组合框 select 一个。
我需要将枚举值和描述绑定到 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();
}
}
SelectedValueBinding
的路径应该是 User
属性 的名称 class:
(e.Column as DataGridComboBoxColumn).SelectedValueBinding = new Binding("Department");
如果 Department
属性 的 User
class 和 Value
属性 的类型,则绑定应该可以工作的 ValueDescriptionVm<Departments>
class 是一样的。