Windows Universal App - 禁用ComboBox

时间:2016-01-14 12:17:07

标签: c# xaml winrt-xaml win-universal-app

我正在尝试为ComboBox设置禁用项目,我有我的项目模型:

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

    public bool IsEnabled { get; set; }
}

ComboBox定义:

<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>

然而似乎无法手动设置项目禁用,但是生成了ComboBoxItem元素(我可以在LiveVisualTree中看到它),它具有IsEnabled属性并且可以正常工作。我可以通过造型

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

这将禁用每个项目,但遗憾的是ItemContainerStyle不绑定到item,因为它具有ComboBox的上下文而不是PermissionsViewItem,所以我不能在这里使用PermissionsViewItem.IsEnabled属性。

是否有任何方法可以禁用特定项目(即使是hacky方式也足够了)?

2 个答案:

答案 0 :(得分:0)

在TextBlock中绑定IsEnabled属性。

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

答案 1 :(得分:0)

您可以按如下所示重写组合框,并在运行时设置绑定。这对我有用

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);
        }
    }