2017-08-14 36 views
0

アイテムソースを設定するデータグリッドがあるList<User>です。 ユーザーのプロパティの1つは、説明付きの列挙型であるDepartmentです。WPF DataGridComboBoxColumn Enumの動的バインド

データグリッドの部署は、ユーザーがコンボボックスとして選択して表示します。 enumの値と説明をDataGridComboBoxColumnにバインドする必要があります。

これまでのところ、EnumをDataGridComboBoxColumn.ItemsSourceにバインドするか管理していましたが、説明は考慮されていません。 または値のコレクションを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(); 
    } 
} 
+1

は、私がここに同様の質問をし、[リンク](https://stackoverflow.com/questions/45349465/wpf-datagrid-datagridcomboboxcolumn-cells-displayed-value)、それはComboBoxSelectedItemはである何@stuicidle – stuicidle

+0

を役に立てば幸いです。 SelectedValueBinding = ComboBoxSelectedItem? (説明、価値の集まり)? –

+0

この例ではコンボボックスから選択したときに更新されるComboBoxOptionオブジェクトです – stuicidle

答えて

1

SelectedValueBindingのパスがUserクラスのプロパティの名前でなければなりません:

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

次にUserクラスのDepartment性のタイプとクラスValueDescriptionVm<Departments>Valueのプロパティが同じであることを条件とするワークべきで結合します。