2017-08-14 161 views
0

我有一个datagrid,我设置项目源List<User>。 用户的其中一个属性是Department,它是带有说明的Enum。WPF DataGridComboBoxColumn枚举的动态绑定

在datagrid中,Departments显示为用户选择的组合框。 我需要将枚举值和说明绑定到DataGridComboBoxColumn

到目前为止,我管理要么将Enum绑定到DataGridComboBoxColumn.ItemsSource,因此它可以工作,但是不会将描述考虑在内。 或设置值的集合,描述为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(); 
    } 
} 
+1

我在这里问了一个类似的问题[链接](https://stackoverflow.com/questions/45349465/wpf-datagrid-datagridcomboboxcolumn-cells-displayed-value),希望它有帮助 – stuicidle

+0

@stuicidle什么是ComboBoxSelectedItem中。 SelectedValueBinding = ComboBoxSelectedItem? (描述,价值的集合)? –

+0

在这个例子中,它是一个ComboBoxOption对象,当您从组合框中进行选择时会得到更新 – stuicidle

回答

1

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

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

然后应该工作条件是User类的Department属性的类型和ValueDescriptionVm<Departments>类的Value属性是相同的结合。