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?

Original source