Reputation: 1921
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
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