Ali Asad
Ali Asad

Reputation: 1315

ComboBox doesn't show binding data in a DataGridTemplateColumn

I've created a custom DataGrid which has columns of comboboxes defined in it. I tried to provide the itemsource value to the combobox but it doesn't populate data in comboboxes on runtime. Here's the C# and XAML code.

public MainWindow()
{
    InitializeComponent();
    datagrid_additionalinfo.Items.Add(new object());

    datagrid_additionalinfo.DataContext = new ComboboxViewModel();
}

public class ComboboxViewModel
{
    public List<string> Members { get; set; }
    public List<string> Disciplines { get; set; }

    public ComboboxViewModel()
    {
        this.Members = new List<string>
        {
            "Ali", "Mubashar", "Muffassir", "Nitin"
        };

        this.Disciplines = new List<string>
        {
            "Architecture", "Mechanical", "Structure"
        };
    }
}

<DataGrid  Name="datagrid_additionalinfo" Margin="20,0,20,0" IsReadOnly="False" SelectionMode="Single" CanUserAddRows="True" AutoGenerateColumns="False" SelectionUnit="Cell" >

     <DataGrid.Columns>

            <DataGridTemplateColumn Header="Discipline"   Width="100" >
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ComboBox Width="200" ItemsSource="{Binding Disciplines}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

            <DataGridTemplateColumn Header="Members"  Width="100">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ComboBox Width="200" ItemsSource="{Binding Members}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

     </DataGrid.Columns>

 </DataGrid>

Please correct me if I'm missing something. Thank you very much.

Upvotes: 0

Views: 43

Answers (1)

Netstep
Netstep

Reputation: 522

DataGrid columns should be placed inside the 'Columns' tag:

    <DataGrid ...>
        <DataGrid.Columns>
          <DataGridTemplateColumn Header="Discipline"   Width="100" >
            ...
          </DataGridTemplateColumn>
          <DataGridTemplateColumn Header="Members"  Width="100">
            ...
          </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>

And, if you prefer populate Items from code, you don't need use DataContext, just write:

    public MainWindow()
    {
        InitializeComponent();
        datagrid_additionalinfo.Items.Add(new ComboboxViewModel());            
    }

Edit:

If you prefer use DataContext, create a ViewModel that contains all items, for example:

public class MainViewModel
{
    public List<ComboboxViewModel> Items { get; set; }

    public MainViewModel()
    {
        Items = new List<ComboboxViewModel>() { new ComboboxViewModel()};
    }
}

And then bind to it in xaml:

<DataGrid  Name="datagrid_additionalinfo" ItemsSource="{Binding Items}" ...>

And setup DataContext:

public MainWindow()
{
    InitializeComponent();
    datagrid_additionalinfo.DataContext = new MainViewModel(); 
}

Upvotes: 1

Related Questions