samedi 9 mai 2015

Description attribute on enum values in WPF DataGrid with AutoGenerateColumns

Here's my enum:

enum Foo {
    [Description("the quick")]
    Bar,
    [Description("brown fox")]
    Baz,
    [Description("jumped over")]
    Qux
}

Here's part of my ViewModel:

class MainWindowViewModel : ViewModelBase {
    public ObservableCollection<RowViewModel> Rows { get { ... } }
}

class RowViewModel : ViewModelBase {
    public String Name { get { ... } set { ... } }
    public Foo Foo { get { ... } set { ... } }
}

Here's my XAML:

<DataGrid AutoGeneratingColumn="OnAutoGeneratingColumn" ItemsSource="{Binding Path=Rows}" />

Because MainWindowViewModel.Rows[n].Foo is an enum, WPF will automatically generate a DataGridComboBoxColumn with the enum members as combobox drop-down values, so far so good.

I want the combobox to use the [Description("")] values in the combobox drop-down and display. So I implemented an IValueConverter. I then added a handler for OnAutoGeneratingColumn:

private void OnAutoGeneratingColumn(Object sender, DataGridAutoGeneratingColumnEventArgs e)
    {
        DataGridComboBoxColumn dgCol = e.Column as DataGridComboBoxColumn;
        if( dgCol != null && e.PropertyType.IsEnum ) {

            Binding binding = new Binding( e.PropertyName );
            binding.Converter = EnumDescriptionValueConverter.Instance;

            dgCol.TextBinding = binding;
            dgCol.SelectedItemBinding = binding;
        }
    }

Unfortunately this doesn't work: the cells appear empty when they have values and the combobox drop-down contains the original enum values rather than descriptions.

Aucun commentaire:

Enregistrer un commentaire