Gabriel Davidian
Gabriel Davidian

Reputation: 318

Windows Universal App - Disable item in ComboBox

I'm trying to set item disabled for ComboBox, I have my item model:

public class PermissionsViewItem
{
    public string Title { get; set; }

    public bool IsEnabled { get; set; }
}

And ComboBox defined:

<ComboBox Background="WhiteSmoke" Margin="65,308,0,0" BorderThickness="0" Width="220" Padding="0" Foreground="#FF7B7A7F" ItemsSource="{Binding PermissionsViewItems}" >
        <ComboBox.ItemTemplate>
            <DataTemplate x:DataType="local:PermissionsViewItem">
                <StackPanel >
                    <Grid>
                        <Border Background="{x:Null}" BorderThickness="0" HorizontalAlignment="Left" VerticalAlignment="Center">
                            <TextBlock Text="{x:Bind Title}" FontWeight="SemiBold" />
                        </Border>
                    </Grid>
                </StackPanel>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>

However there seems to be no way to set item disabled manually, but there is ComboBoxItem element generated (I can see it in LiveVisualTree) which has IsEnabled property and it works. I can access it via Styling

<ComboBox.ItemContainerStyle>
    <Style TargetType="ComboBoxItem" >
        <Setter Property="IsEnabled" Value="False"/>
    </Style>
</ComboBox.ItemContainerStyle>

This would disable every item, but unfortunately ItemContainerStyle does not bind to item, because it has context of ComboBox not PermissionsViewItem so I cannot utilize PermissionsViewItem.IsEnabled property here.

Is there is any way to disable specific item (even a hacky way will suffice)?

Upvotes: 0

Views: 1283

Answers (2)

Karthik
Karthik

Reputation: 95

You can override the combobox as follows and set the bindings at run time. This works for me

public class ZCombobox:ComboBox
    {
        protected override void PrepareContainerForItemOverride(Windows.UI.Xaml.DependencyObject element, object item)
        {
            ComboBoxItem zitem = element as ComboBoxItem;

            if (zitem != null)
            {
                Binding binding = new Binding();
                binding.Path = new PropertyPath("IsSelectable");
                zitem.SetBinding(ComboBoxItem.IsEnabledProperty, binding);
            }
            base.PrepareContainerForItemOverride(element, item);
        }
    }

Upvotes: 1

G.Mich
G.Mich

Reputation: 1666

Bind IsEnabled property in TextBlock.

<TextBlock Text="{x:Bind Title}" FontWeight="SemiBold" IsEnabled="{Binding IsEnabled}" />

Upvotes: -1

Related Questions