wpfbindingdatagridcomboboxdatagridcomboboxcolumn

Binding SelectedItem of ComboBox in DataGrid with different type


I have a DataGrid which contains ComboBox as column.

Let consider DataGrid having ItemsSource as ObservableCollection and ComboBox ItemsSource is List .

I want to set the ComboBox SelectedItem property based on property in DataGrid ItemsSource.

However Product class has property ProductTypeId of type int and not ProductType.

So how can I set ComboBox SelectedItem so that it display value of Product.ProductTypeId as selected. And also I want to bind SeletedItems with Mode = TwoWay so that whenever ComboBox SelectedItem changes it will be reflected in DataGrid's ItemsSource.

Any help would be much appreciated.

Thanks.


Solution

  • The DataGridComboBoxColumn does exactly what you're looking for. To use it correctly, you need to understand the following properties:

    Setting the ItemsSource of the DataGridComboBoxColumn is a little different; note my example below to see how it is done.

    These are the same (except for SelectedValueBinding) as you have on a standard ComboBox.

    Here is an example of what your column might look like.

    <DataGridComboBoxColumn Header="Product Type" DisplayMemberPath="ProductType" SelectedValuePath="ProductTypeId" SelectedValueBinding="{Binding ProductTypeId, UpdateSourceTrigger=PropertyChanged}">
        <DataGridComboBoxColumn.ElementStyle>
            <Style TargetType="{x:Type ComboBox}">
                <Setter Property="ItemsSource" Value="{Binding AvailableProductTypes}"/>
                <Setter Property="VerticalAlignment" Value="Center"/>
            </Style>
        </DataGridComboBoxColumn.ElementStyle>
        <DataGridComboBoxColumn.EditingElementStyle>
            <Style TargetType="{x:Type ComboBox}">
                <Setter Property="ItemsSource" Value="{Binding AvailableProductTypes}"/>
                <Setter Property="VerticalAlignment" Value="Center"/>
            </Style>
        </DataGridComboBoxColumn.EditingElementStyle>
    </DataGridComboBoxColumn>