Binding DataGridComboBoxColumn
Since RoadTypes isn't a simple list of strings you need to tell your combobox what property it needs to display in the ComboBox. Try adding
DisplayMemberPath="Name"
to your combobox declartion
--
Update:
Okay, this is a known "feature" with WPF datagrids. The issue is that the DataGridComboBox doesn't have the DataContext of the DataGrid. I modified the binding for the ComboBox to look like this:
<DataGridComboBoxColumn DisplayMemberPath="Name">
<DataGridComboBoxColumn.ElementStyle>
<Style>
<Setter Property="ComboBox.ItemsSource" Value="{Binding Path=RoadTypes}" />
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style>
<Setter Property="ComboBox.ItemsSource" Value="{Binding Path=RoadTypes}" />
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
I modified the code you provided in your download link and the combobox items were displayed when I opened the combobox dropdown.
Check out some of these links for further clarification:
http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/b4b13a72-47f9-452f-85c6-6c4b5b606df5/
How to bind collection to WPF:DataGridComboBoxColumn
Excedrin headache #3.5.40128.1: Using combo boxes with the WPF DataGrid
What led me to look at all of these sites is looking at the Output window and noticing the error message System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. message
Unforgiven
Updated on July 01, 2020Comments
-
Unforgiven almost 4 years
I am trying to bind ObservableCollection of T to DataGridComboBoxColumn of DataGrid.
DataGrid definition is :<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Model, IsAsync=True}"> <DataGrid.Columns> <DataGridTextColumn Header="Column Entry" IsReadOnly="True" Binding="{Binding ColumnName}"/> <DataGridComboBoxColumn Header="Road Type" ItemsSource="{Binding RoadTypes}"/> </DataGrid.Columns> </DataGrid>
This is ViewModel and Model
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); var viewModel = new ViewModel(); DataContext = viewModel; } } public class ViewModel : ViewModelBase { private ObservableCollection<Model> _model; public ViewModel() { var list = new List<Model>(); var roadTypes = new ObservableCollection<RoadType> { new RoadType { Code = 1, Id = 1, Name = "Name1" }, new RoadType { Code = 1, Id = 1, Name = "Name1" } }; Model = new ObservableCollection<Model> { new Model { ColumnName = "Col1", RoadTypes = roadTypes }, new Model { ColumnName = "Col1", RoadTypes = roadTypes } }; } public ObservableCollection<Model> Model { get { return _model; } set { _model = value; RaisePropertyChanged(() => Model); } } } public class RoadType { public int Id { get; set; } public int Code { get; set; } public string Name { get; set; } } public class Model : ObservableObject { private ObservableCollection<RoadType> _roadTypes; public string ColumnName { get; set; } public ObservableCollection<RoadType> RoadTypes { get { return _roadTypes; } set { _roadTypes = value; RaisePropertyChanged(() => RoadTypes); } } }
DataGrid displays text column as well but it doesn't display ComboBox values.
What's wrong?