ComboBox in DataGrid
I came across a question that how to display combo box in Data Grid. It is not different than displaying it in ListView we saw here. Similarly we have need to make a nested data structure first. Here is our data class.
code:
public class State
{
public string Name
{ get; set; }
public string TimeZone
{ get; set; }
public string Capital
{ get; set; }
public ObservableCollection<string> Cities
{ get; set; }
}
Then we populate it with some data.
Code:
states.Add(new State()
{
Name = "Maryland",
Capital = "Annapolis",
TimeZone = "Eastern",
Cities = new ObservableCollection<string>() { "Frederick", "Baltimore", "Rockville"}
});
states.Add(new State()
{
Name = "Taxes",
Capital = "Austin",
TimeZone = "Central",
Cities = new ObservableCollection<string>() { "Houston", "Dallas", "San Antonio" }
});
states.Add(new State()
{
Name = "Utah",
Capital = "Salt Lake City",
TimeZone = "Mountain",
Cities = new ObservableCollection<string>() { "West Valley City", "Provo", "West Jordon" }
});
states.Add(new State()
{
Name = "California",
Capital = "Sacramento",
TimeZone = "Pacific",
Cities = new ObservableCollection<string>() { "Los Angeles", "San Fransisco", "San Diego" }
});
Then we define DataGridTemplateColumn and define data template for our column where we want to display the combo box. Here is a piece of XAML code for this.
Code:
<DataGridTemplateColumn Header="Cities" Width="*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox Margin="2" ItemsSource="{Binding Cities}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
Rest of the code is very simple. Here is our complete C# code of the program.
Code:
using System.Collections.ObjectModel;
using System.Windows;
namespace WpfDataGridCombo
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private ObservableCollection<State> states = new ObservableCollection<State>();
public MainWindow()
{
InitializeComponent();
states.Add(new State()
{
Name = "Maryland",
Capital = "Annapolis",
TimeZone = "Eastern",
Cities = new ObservableCollection<string>() { "Frederick", "Baltimore", "Rockville"}
});
states.Add(new State()
{
Name = "Taxes",
Capital = "Austin",
TimeZone = "Central",
Cities = new ObservableCollection<string>() { "Houston", "Dallas", "San Antonio" }
});
states.Add(new State()
{
Name = "Utah",
Capital = "Salt Lake City",
TimeZone = "Mountain",
Cities = new ObservableCollection<string>() { "West Valley City", "Provo", "West Jordon" }
});
states.Add(new State()
{
Name = "California",
Capital = "Sacramento",
TimeZone = "Pacific",
Cities = new ObservableCollection<string>() { "Los Angeles", "San Fransisco", "San Diego" }
});
DataContext = states;
}
}
public class State
{
public string Name
{ get; set; }
public string TimeZone
{ get; set; }
public string Capital
{ get; set; }
public ObservableCollection<string> Cities
{ get; set; }
}
}
Here is complete XAML code of our program.
Code:
<window x:class="WpfDataGridCombo.MainWindow" xmlns:x="#unknown">
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Combo Box in Daga Grid" Height="300" Width="400">
<grid>
<datagrid margin="5" itemssource="{Binding}" autogeneratecolumns="False">
<datagrid.columns>
<datagridtextcolumn header="Name" binding="{Binding Name}">
<datagridtextcolumn header="Capital" binding="{Binding Capital}">
<datagridtextcolumn header="Time Zone" binding="{Binding TimeZone}">
<datagridtemplatecolumn header="Cities" width="*">
<datagridtemplatecolumn.celltemplate>
<datatemplate>
<combobox margin="2" itemssource="{Binding Cities}">
Code