禁止/阻止选择wpf中禁用的组合框项目

时间:2014-01-02 19:06:13

标签: c# .net wpf mvvm combobox

我正在编写一个应用程序,其中我想禁用ComboBox中的少数项目,并且还想禁止/阻止选择已禁用的项目。请注意,主窗口中的ComboBox有另一个ComboBox作为ComboBox项目初始化(由运行时由数据模板选择器决定)。

使用下面的代码,我可以在ComboBox中禁用ComboBox,但它不会阻止用户选择禁用的ComboBox项。禁止/阻止选择禁用物品的任何帮助都会有所帮助。

以下是代码段

主窗口中的ComboBox:

<Grid>
    <ComboBox HorizontalAlignment="Left" VerticalAlignment="Top" 
              Width="120" Margin="87.2,44.8,0,0" 
              ItemsSource="{Binding Cars}" 
              ItemsPanel="{DynamicResource ItemsPanelTemplateHorizontal}"
              ItemTemplateSelector="{StaticResource QualityComboBoxTemplateSelector}"
              SelectedItem="{Binding SelectedItm}"/>
</Grid>

数据模板选择器:

public class QualityComboBoxTemplateSelector : DataTemplateSelector
{
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        var element = container as FrameworkElement;

        var dataTemplate = element.FindResource(((item is string) && item.Equals("Ferrari")) ?
                                                       "DataTemplateTopLevelCombobox2" : "DataTemplateTopLevelCombobox1") as DataTemplate;

        return dataTemplate;
    }
}

以上ComboBox的数据模板:

<DataTemplate x:Key="DataTemplateTopLevelCombobox1">
    <Border BorderBrush="Black" BorderThickness="1" >
        <TextBlock HorizontalAlignment="Left" 
                   TextWrapping="Wrap" Text="{Binding}"     
                   VerticalAlignment="Top"/>
    </Border>
</DataTemplate>

<DataTemplate x:Key="DataTemplateTopLevelCombobox2">
    <Border Width="100">
        <ComboBox Text="Custom" Height="21.96"
        ItemsSource="{Binding DataContext.Models, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"
        IsEnabled="{Binding DataContext.EnableCombo, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" />
    </Border>
</DataTemplate>

1 个答案:

答案 0 :(得分:30)

您可以通过将IsEnabled的{​​{1}}属性设置为ComboBoxItem来实现此目的;

因此,ComboBox的false中的每个项目(例如ItemSource)都可以是具有某些属性(例如Cars)的对象,指定是应该启用还是禁用它然后使用它具有使项目无法选择的风格。像这样的东西 -

IsSelectable

更新

<Style TargetType="ComboBoxItem"> 
   <Setter Property="IsEnabled" Value="{Binding IsSelectable}"/> 
</Style>