Bogey
Bogey

Reputation: 5724

WPF: Clickable button in ItemTemplate of a ComboBoxItem with IsEnabled=false

Trying to set up a WPF ComboBox; some of its items should not be selectable, so I'm binding IsEnabled to some property of the underlying item.

At the same time, I need to define an ItemTemplate that contains e.g. a Button. This button needs to be clickable, even if the item is not selectable (worth nothing a click on the button should not select the item as such of course; it will trigger a command performing some background actions, which will eventually make the underlying item selectable)

However, when ComboBoxItem.IsEnabled = false, it seems even the button automatically gets disabled.

Brief example:

    <ComboBox ItemsSource="{Binding Items}">
        <ComboBox.ItemContainerStyle>
            <Style TargetType="{x:Type ComboBoxItem}">
                <Setter Property="IsEnabled" Value="{Binding CanSelectItem}"/>
            </Style>
        </ComboBox.ItemContainerStyle>

        <ComboBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Name}"/>

                    <!-- This button isn't clickable when ComboBoxItem.IsEnabled = false .. but it should be! -->
                    <Button Content="Click me" Command="{Binding SomeCmd}"/>
                </StackPanel>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>

Is there any way to circumvent this? E.g., set some items as non-selectable, however define a button in the ItemTemplate that remains clickable regardless?

Thanks

Upvotes: 0

Views: 527

Answers (2)

Bogey
Bogey

Reputation: 5724

For future reference, have found another way of doing this, based on this answer:

WPF override IsEnabled from Parent

So basically creating a class derived from button that overrides the default IsEnabled behavior.

Benefit is that this seems to do exactly what I was looking for, but it does change one of WPF's pretty.. default behaviors, so might need to be taken with a bit of care

Upvotes: 0

Mighty Badaboom
Mighty Badaboom

Reputation: 6155

When you remove the ComboBox.ItemContainerStyle you can set the IsEnabled property of each element in the DataTemplate

<ComboBox.ItemTemplate>
    <DataTemplate>
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding Name}"
                       IsEnabled="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.IsEnabled}"/>
            <Button Content="Click me" Command="{Binding SomeCmd}"/>
        </StackPanel>
    </DataTemplate>
</ComboBox.ItemTemplate>

The combobox item will still be enabled but the TextBlock will be disabled. The binding is just an example. Depends on where your IsEnabled property is. In my example the property is in the viewmodel which is DataContext of your Window.

Upvotes: 1

Related Questions