2017-08-14 3 views
0

J'ai une grille de données à laquelle j'ai défini la source d'élément List<User>. L'une des propriétés de l'utilisateur est Department qui est Enum avec des descriptions.liaison dynamique WPF DataGridComboBoxColumn d'Enum

Dans la grille de données Les rayons sont affichés en tant que liste déroulante pour qu'un utilisateur en sélectionne un. J'ai besoin de lier la valeur enum et la description au DataGridComboBoxColumn. Jusqu'à présent, j'ai réussi à lier Enum à DataGridComboBoxColumn.ItemsSource, donc cela fonctionne mais la description n'est pas prise en compte. ou définir la collection de valeur, description à DataGridComboBoxColumn.ItemsSource et définir DisplayMemberPath, SelectedValuePath. Mais dans ce cas, la valeur ne lie pas à DataGridComboBoxColumn.

La vue:

<DataGrid x:Name="userData" HorizontalAlignment="Stretch" Margin="10,157,10,80" VerticalAlignment="Stretch" Height="Auto" Width="Auto" 
AutoGeneratingColumn="UserData_OnAutoGeneratingColumn" DisplayMemberPath="Description"/> 

Le code:

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"; 
     } 
    } 

l'extension 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

J'ai posé une question similaire ici [lien] (https://stackoverflow.com/questions/45349465/wpf-datagrid-datagridcomboboxcolumn-cells-displayed-value), espère que cela aide – stuicidle

+0

@stuicidle Qu'est-ce que ComboBoxSelectedItem dans. SelectedValueBinding = ComboBoxSelectedItem? (Une collection de description, valeur)? –

+0

Dans l'exemple, il s'agit d'un objet ComboBoxOption, qui est mis à jour lorsque vous faites une sélection dans la zone de liste déroulante – stuicidle

Répondre

1

Le chemin du SelectedValueBinding doit être le nom de la propriété de la classe User :

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

Ensuite, la liaison devrait fonctionner à condition que le type de la propriété Department de la classe User et la propriété Value de la classe ValueDescriptionVm<Departments> est le même.