Search code examples
wpfxamlcomboboxdatacontextimultivalueconverter

Binding Combobox does not work when a Converter is used


I'm trying to bind a ComboBox to DataContext.

<ComboBox ItemsSource="{Binding Path=Numbers}"
                                SelectedValue="{Binding Path=CurrentNumber,Mode=TwoWay}">
</ComboBox>

The above code works, but when I try to change how the items are displayed using a converter implementing IMultiValueConverter and MultiBinding nothing is displayed. I have debugged the method implementing the IMultiValueConverter and it is not getting executed. What could be the problem?

<ComboBox ItemsSource="{Binding Path=Numbers}"
                                SelectedValue="{Binding Path=CurrentNumber,Mode=TwoWay}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock>
                <TextBlock.Text>
                    <MultiBinding Converter="{StaticResource MultiUnitConverter}" ConverterParameter="{x:Static enumerations:Quantity.Length}" >
                        <Binding Path="."/>
                        <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type Window}}" Path="DataContext.CurrentUnit"/>
                    </MultiBinding>
                </TextBlock.Text>
            </TextBlock>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

Update:

I tried the following instead of the ComboBox, the converter is fired and the data is loaded but not displayed!

<TextBlock>
    <TextBlock.Text>
        <MultiBinding Converter="{StaticResource MultiUnitConverter}" ConverterParameter="{x:Static enumerations:Quantity.Length}" >
            <Binding Path="CurrentNumber"/>
            <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type Window}}" Path="DataContext.CurrentUnit"/>
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>

The following works though:

<TextBlock>
    <TextBlock.Text>
        <Binding Path="CurrentNumber"></Binding>
    </TextBlock.Text>
</TextBlock>

Solution

  • For all who may get stuck with this in the future and ruin their entire evening here is the solution I found!

    It seems adding StringFormat solves the problem!

    <ComboBox ItemsSource="{Binding Path=Numbers}" SelectedItem="{Binding Path=Number, Mode=TwoWay}">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <TextBlock>
                    <TextBlock.Text>
                        <MultiBinding 
                                    Converter="{StaticResource MultiUnitConverter}" 
                                    ConverterParameter="{x:Static enumerations:Quantity.Length}"
                                    StringFormat="{}{0:0.###}">
                            <Binding Path="."/>
                            <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type Window}}" Path="DataContext.CurrentUnit"/>
                        </MultiBinding>
                    </TextBlock.Text>
                </TextBlock>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>