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();
}
}
Ich habe eine ähnliche Frage hier gestellt [Link] (https://stackoverflow.com/questions/45349465/wpf-datagrid-datagridcomboboxcolumn-cells-displayed-value), hoffe, es hilft – stuicidle
@stuicidle Was ist ComboBoxSelectedItem in. SelectedValueBinding = ComboBoxSelectedItem? (Eine Sammlung von Beschreibung, Wert)? –
In dem Beispiel ist es ein ComboBoxOption-Objekt, das aktualisiert wird, wenn Sie eine Auswahl aus dem Kombinationsfeld – stuicidle