Search code examples
c#wpfdatagriddatagridcomboboxcolumn

Binding DataGridComboBoxColumn to an enum declared inside a class


I have a datagrid thats bound to my database: Member Datagrid I want the gender column to be a combobox with its selected value coming from the database. Gender is an enum inside the Member class:

namespace Elysium.model
{ 
    class Member
    {
        public enum MemberType { Standard, Premium }
        public enum Status { Inactive, Active }
        public enum Gender { Male, Female } 

I have tried to bind it the following way but it gives me an error that Gender is not defined in the namespace or nesting is not allowed when I do <x:Type TypeName="local.Member:Gender" ></x:Type> :

<ObjectDataProvider x:Key="genderEnum" MethodName="GetValues" ObjectType="{x:Type LocalValueEnumerator}">
        <ObjectDataProvider.MethodParameters>
            <x:Type TypeName="local:Gender" ></x:Type>
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>

ViewMembers.xaml:

<Grid DataContext="{StaticResource memberViewSource}">
    <DataGrid x:Name="memberDataGrid" AutoGenerateColumns="False" EnableRowVirtualization="True" ItemsSource="{Binding}" RowDetailsVisibilityMode="VisibleWhenSelected" Width="1100" Height="600">
        <DataGrid.Columns>
            <DataGridTextColumn x:Name="memberIDColumn" Binding="{Binding MemberID}" Header="Member ID" Width="SizeToHeader"/>
            <DataGridTextColumn x:Name="nameColumn" Binding="{Binding Name}" Header="Name" Width="SizeToHeader"/>
            <DataGridTextColumn x:Name="fatherNameColumn" Binding="{Binding FatherName}" Header="Father Name" Width="SizeToHeader"/>
            <DataGridComboBoxColumn x:Name="genderColumn" SelectedValueBinding="{Binding Value}" Header="Gender" Width="SizeToHeader"/>

ViewMembers.xaml.cs:

public partial class ViewMembers : Page
{
    DataTable memberTable = new DataTable();

    public ViewMembers()
    {
        InitializeComponent();
        MemberDatabase members = MemberDatabase.getApplicationDatabase();
        memberTable = members.getAllMembers();
        memberDataGrid.ItemsSource = memberTable.DefaultView;
    }

Project Structure:

Project Architecture


Solution

  • The ObjectType should be set to System.Enum:

    <ObjectDataProvider x:Key="genderEnum" 
                        xmlns:sys="clr-namespace:System;assembly=mscorlib"
                        MethodName="GetValues" ObjectType="{x:Type sys:Enum}">
        <ObjectDataProvider.MethodParameters>
            <x:Type TypeName="local:Gender" />
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>
    

    Usage:

    <DataGridComboBoxColumn x:Name="genderColumn"
                            ItemsSource="{Binding Source={StaticResource genderEnum}}" ... />