vmo*_*ore 18 .net c# wpf combobox mvvm
我正在编写一个应用程序,其中我想禁用其中的几个项目,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>
Run Code Online (Sandbox Code Playgroud)
数据模板选择器:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
以上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>
Run Code Online (Sandbox Code Playgroud)
akj*_*shi 31
您可以通过设置a的IsEnabled属性来实现此ComboBoxItem目的false;
因此,ComboBox中的每个项目ItemSource(即Cars在您的情况下)可以是具有某些属性(例如IsSelectable)的对象,指定是应该启用还是禁用它,然后将其与样式一起使用以使项目不可选.像这样的东西 -
<Style TargetType="ComboBoxItem">
<Setter Property="IsEnabled" Value="{Binding IsSelectable}"/>
</Style>
Run Code Online (Sandbox Code Playgroud)
更新:
<Grid>
<ComboBox
Width="120"
Margin="87.2,44.8,0,0"
HorizontalAlignment="Left"
VerticalAlignment="Top"
ItemTemplateSelector="{StaticResource QualityComboBoxTemplateSelector}"
ItemsPanel="{DynamicResource ItemsPanelTemplateHorizontal}"
ItemsSource="{Binding Cars}"
SelectedItem="{Binding SelectedItm}">
<ComboBox.ItemContainerStyle>
<Style TargetType="ComboBoxItem">
<Setter
Property="IsEnabled"
Value="{Binding IsSelectable}" />
</Style>
</ComboBox.ItemContainerStyle>
</ComboBox>
</Grid>
Run Code Online (Sandbox Code Playgroud)
解决@JordyBoom指出的问题.
ItemsContainerGenerator 在下拉列表至少打开一次之前不会生成项目.
因此,如果您打开下拉菜单并在窗口加载的事件处理程序中再次关闭它,那么所有应该可以正常使用鼠标和键盘选择.
public MainWindow()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(onLoaded);
}
private void onLoaded(object sender, RoutedEventArgs e)
{
cmbx.IsDropDownOpen = true;
cmbx.IsDropDownOpen = false;
}
Run Code Online (Sandbox Code Playgroud)
source:WPF:禁用组合框项目 - 使用键盘访问时也是如此
| 归档时间: |
|
| 查看次数: |
24870 次 |
| 最近记录: |