我正在编写一个应用程序,其中我想禁用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>
答案 0 :(得分:30)
您可以通过将IsEnabled
的{{1}}属性设置为ComboBoxItem
来实现此目的;
因此,ComboBox的false
中的每个项目(例如ItemSource
)都可以是具有某些属性(例如Cars
)的对象,指定是应该启用还是禁用它然后使用它具有使项目无法选择的风格。像这样的东西 -
IsSelectable
更新
<Style TargetType="ComboBoxItem">
<Setter Property="IsEnabled" Value="{Binding IsSelectable}"/>
</Style>