o..o
o..o

Reputation: 1921

ComboBox not binding in datagrid

I have a ComboBox binded to BindingList with strings. It is working fine.

public BindingList<string> MyList
{
    get
    {
        BindingList<string> list = new BindingList<string>();
        list.Add("one");
        list.Add("two");
        list.Add("three");

        return list;
    }
}

xaml:

<ComboBox x:Name="MyCmbBox" ItemsSource="{Binding Path=MyList}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding}" />
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

When I same code put into the WPF 4 datagrid, it's not working any more (but the combo outside datagrid is still running ok):

<DataGrid AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTemplateColumn>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox x:Name="MyCmbBox" ItemsSource="{Binding Path=MyList}">
                        <ComboBox.ItemTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding}" />
                            </DataTemplate>
                        </ComboBox.ItemTemplate>
                    </ComboBox>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

Why? Thank you

Upvotes: 0

Views: 1983

Answers (1)

Pavlo Glazkov
Pavlo Glazkov

Reputation: 20746

Because in case of DataGrid the ComboBox has different DataContext - the grid row data item, which doesn't have the MyList property.

To fix this, you can use RelativeSource binding to bind to the DataContext of the grid:

<DataGrid AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTemplateColumn>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox x:Name="MyCmbBox" ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Path=DataContext.MyList}">
                        <ComboBox.ItemTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding}" />
                            </DataTemplate>
                        </ComboBox.ItemTemplate>
                    </ComboBox>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

Upvotes: 2

Related Questions