Search code examples
wpfcomboboxcontentcontrol

wpf combobox not binding to collection when inside ContentTemplate


I'm trying show a certain control based on a property (combobox or textbox). So I have this contentcontrol implemented:

   <!--<ComboBox MaxWidth="200" Background="#333333" ItemsSource="{Binding ModelObjectWrapper.Values}" Grid.Row="1" Grid.Column="1"/>-->
    <ContentControl Grid.Row="1" Grid.Column="1">
        <ContentControl.Resources>
            <Style TargetType="ContentControl">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding ModelObjectWrapper.ObjType}" Value="typeA">
                        <Setter Property="ContentTemplate">
                            <Setter.Value>
                                <DataTemplate>
                                    <ComboBox HorizontalAlignment="Left" MaxWidth="200" Background="#333333" ItemsSource="{Binding ModelObjectWrapper.Values, UpdateSourceTrigger=PropertyChanged}"/>
                                </DataTemplate>
                            </Setter.Value>
                        </Setter>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding ModelObjectWrapper.ObjType}" Value="typeB">
                        <Setter Property="ContentTemplate">
                            <Setter.Value>
                                <DataTemplate>
                                    <TextBox />
                                </DataTemplate>
                            </Setter.Value>
                        </Setter>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </ContentControl.Resources>
    </ContentControl>

The problem is that the combobox is not showing any items when its part of a controltemplate, and I know the bound list does have them, so I'm assuming the combobox is not being bound to the ItemsSource correctly. The first line (having only a combobox without the templates), commented out, works fine. Am I not doing the binding right? Could it be that because its part of a datatrigger, it's not getting the right DataContext? I must note that the DataTrigger itself works great (IE showing a combobox if *.ObjType == "typeA".

The VM is a wrapper class around an object:

public class ModelObjectWrapper : ViewModelBase
{
private theModelObject model_obj;

public ModelObjectWrapper(theModelObject obj)
{
    model_obj = obj;
}       

public ObservableCollection<string> Values
{
    get { return model_obj.Values; }
    set
    {
        if (value == model_obj.Values)
            return;

        model_obj.Values = value;
        OnPropertyChanged();
    }
}
}

Solution

  • The DataContext of the root element in a ContentControl is the Content of the same ContentControl. Try to use a RelativeSource to bind to a property of the ContentControl's DataContext:

    <ComboBox HorizontalAlignment="Left" MaxWidth="200" Background="#333333" 
              ItemsSource="{Binding DataContext.ModelObjectWrapper.Values, RelativeSource={RelativeSource AncestorType=ContentControl}}"/>
    

    By the way, there is no point setting the UpdateSourceTrigger of an ItemsSource binding to PropertyChanged because the ComboBox never sets the source property.