WPF DataGrid: DataGridComboxBox ItemsSource Binding to a Collection of Collections
c#, datagrid, datagridcomboboxcolumn, itemssource, wpf
Solution
Firstly, this should be easy... secondly, why are you building (and binding) columns in C#? Eek.
XAML (I'm using a regular grid because I'm lazy):
<ListView Name="MyListView">
<ListView.View>
<GridView>
<GridView.Columns>
<GridViewColumn DisplayMemberBinding="{Binding Operation}" />
<GridViewColumn>
<GridViewColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding Choices}" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView.Columns>
</GridView>
</ListView.View>
</ListView>
C#:
void Window1_Loaded(object sender, RoutedEventArgs e)
{
var dahList = new List<StatsOperation>();
dahList.Add(new StatsOperation
{
Operation = "Op A",
Choices = new string[] { "One", "Two", "Three" },
});
dahList.Add(new StatsOperation
{
Operation = "Op B",
Choices = new string[] { "4", "5", "6" },
});
this.MyListView.ItemsSource = dahList;
}
The Results:
WPF grid with dynamic combo box choices http://www.singingeels.com/Articles/Articles/UserImage.aspx?ImageID=b1e3f880-c278-4d2b-bcc2-8ad390591200
Problem
Situation: I've created a DataGrid in XAML and the ItemsSource is binded to an ObservableCollection of a certain class that contains properties. Then in C#, I create a DataGridTextColumn and a DataGridComboBoxColumn and binded these to the properties of the objects inside the ObservableCollection. I can bind the DataGridComboBoxColumn to a simple Collection but what I want to do is bind it to a collection of collections of strings so that for each row the ComboBox inside the DataGrid has a different collection of string. I have failed to do so... Question: How can I bind the DataGridCombBoxColumn so that I can have a different collection of strings for each row of this type of column? Code Sample: XAML: ``` <Window> <!-- ... --> WPFToolkit:DataGrid x:Name="DG_Operations" Margin="10,5,10,5" Height="100" HorizontalAlignment="Stretch" FontWeight="Normal" ItemsSource="{Binding Path=OperationsStats}" AlternatingRowBackground="{DynamicResource SpecialColor}" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Visible" SelectionMode="Extended" CanUserAddRows="False" CanUserDeleteRows="False" CanUserResizeRows="True" CanUserSortColumns="True" AutoGenerateColumns="False" IsReadOnly="False" IsEnabled="True" BorderThickness="1,1,1,1" VerticalAlignment="Stretch"/> <!-- ... --> </Window> ``` C#: ``` public class DataModelStatsOperations { public ObservableCollection<IStatsOperation> OperationsStats { get; set; } } public interface IStatsOperation { string Operation { get; set; } Collection<string> Data{ get; set; } } public class StatsOperation : IStatsOperation { public StatsOperation(string operation, Collection<string> data) { Operation = operation; Data = data; } public string Operation { get; set; } public Collection<string> Data{ get; set; } } private ObservableCollection<IStatsOperation> dataOperations_ = new ObservableCollection<IStatsOperation>(); //... Binding items = new Binding(); PropertyPath path = new PropertyPath("Operation"); items.Path = path; DG_Operations.Columns.Add(new DataGridTextColumn() { Header = "Operations", Width = 133, Binding = items }); DG_Operations.Columns.Add(new DataGridComboBoxColumn() { Header = "Data", Width = 190, ItemsSource = /*???*/, SelectedValueBinding = new Binding("Data"), TextBinding = new Binding("Data") }); dataOperations_.Add(new StatsOperation(CB_Operation.SelectedItem.ToString(), dataCollection)); DG_Operations.DataContext = new DataModelStatsOperations { OperationsStats = dataOperations_ }; //... ``` Any help would be greatly appreciated! Notes: Okay, so after reading the two first answers I noticed something. My binding is really not right! Now, what I want to do is something similar to what AndyG proposed: ``` DG_Operations.Columns.Add(new DataGridComboBoxColumn() { Header = "Data", Width = 190, ItemsSource = new Binding("Data"), //notice this here does not work (have a look at the following error) SelectedValueBinding = new Binding("Operation"), TextBinding = new Binding("Operation") }); ``` Error: "Cannot implicitly convert type 'System.Windows.Data.Binding' to 'System.Collections.IEnumerable'." How can the ItemsSource be bound to Data?