2017-08-14 4 views
0

Ich habe ein Datagrid, auf dem ich Artikelquelle List<User> gesetzt. Eine der Eigenschaften von Benutzer ist Department die Enum mit Beschreibungen ist.WPF DataGridComboBoxColumn dynamische Bindung von Enum

Im Datagrid werden Abteilungen als Combobox angezeigt, damit ein Benutzer einen auswählen kann. Ich muss enum Wert und Beschreibung an die DataGridComboBoxColumn binden.

Bisher gelang es mir entweder Enum an DataGridComboBoxColumn.ItemsSource zu binden, also funktioniert es, aber die Beschreibung wird nicht berücksichtigt. Oder setzen Sie die Sammlung von Wert, Beschreibung auf DataGridComboBoxColumn.ItemsSource und setzen Sie DisplayMemberPath, SelectedValuePath. In diesem Fall ist der Wert jedoch nicht an DataGridComboBoxColumn gebunden.

The View:

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

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

Enum-Erweiterung:

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

Ich habe eine ähnliche Frage hier gestellt [Link] (https://stackoverflow.com/questions/45349465/wpf-datagrid-datagridcomboboxcolumn-cells-displayed-value), hoffe, es hilft – stuicidle

+0

@stuicidle Was ist ComboBoxSelectedItem in. SelectedValueBinding = ComboBoxSelectedItem? (Eine Sammlung von Beschreibung, Wert)? –

+0

In dem Beispiel ist es ein ComboBoxOption-Objekt, das aktualisiert wird, wenn Sie eine Auswahl aus dem Kombinationsfeld – stuicidle

Antwort

1

Der Weg des SelectedValueBinding der Name der Eigenschaft der User Klasse sein sollte :

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

Dann wird die Bindung zur Verfügung gestellt sollte funktionieren, dass die Art der Department Eigenschaft der User Klasse und die Value Eigenschaft der ValueDescriptionVm<Departments> Klasse gleich ist.