C# WPF组合框禁用的项在边框上仍可选择

C# WPF组合框禁用的项在边框上仍可选择,c#,wpf,combobox,C#,Wpf,Combobox,当我禁用某些组合框项目时,它们在嵌套textblock的左右边框上保持可选状态 我尝试将textbox的边距和combobox项的填充设置为0,然后尝试将textbox和combobox项的水平对齐属性设置为“拉伸”,但没有结果 WPF: <Window.Resources> <local:ComboboxItemsDisableConverter x:Key="ComboboxItemsDisableConverter"/> </Wi

当我禁用某些组合框项目时,它们在嵌套textblock的左右边框上保持可选状态

我尝试将textbox的边距和combobox项的填充设置为0,然后尝试将textbox和combobox项的水平对齐属性设置为“拉伸”,但没有结果

WPF:

<Window.Resources>
    <local:ComboboxItemsDisableConverter x:Key="ComboboxItemsDisableConverter"/>
</Window.Resources>

<ComboBox x:Name="comboBox" HorizontalAlignment="Right" Margin="0,13,10,0" Width="441"
SelectedIndex="{Binding ViewModel.SelectedNic, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MainWindow}}}" 
ItemsSource="{Binding ViewModel.NICs, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MainWindow}}}" 
SelectionChanged="ComboBox_SelectionChanged" 
IsReadOnly="True" Height="25" VerticalAlignment="Top" Grid.Row="2">
    <ComboBox.ItemContainerStyle>
        <Style TargetType="ComboBoxItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch" />
        </Style>
    </ComboBox.ItemContainerStyle>
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <ComboBoxItem IsEnabled="{Binding OperationalStatus, Converter={StaticResource ComboboxItemsDisableConverter}}" >
                <TextBlock HorizontalAlignment="Stretch" Text="{Binding Description}" />
            </ComboBoxItem>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>
我可以做些什么来防止完全选择禁用的项目

隐藏项适用于以下代码:

<ComboBox.ItemContainerStyle>
            <Style TargetType="ComboBoxItem">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Path=OperationalStatus, Converter={StaticResource ComboboxItemsDisableConverter}}" Value="true">
                        <Setter Property="Visibility" Value="Collapsed"></Setter>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </ComboBox.ItemContainerStyle>

如果我使用这个标记

<ComboBox x:Name="comboBox" HorizontalAlignment="Right" Margin="0,13,10,0" Width="441" SelectedIndex="{Binding SelectedNic}"  ItemsSource="{Binding NICs}" SelectionChanged="ComboBox_SelectionChanged" IsReadOnly="True" Height="25" VerticalAlignment="Top" Grid.Row="1">
        
        <ComboBox.ItemTemplate>
            <DataTemplate>                    
                    <TextBlock HorizontalAlignment="Stretch" Text="{Binding Description}" IsEnabled="{Binding OperationalStatus, Converter={StaticResource ComboboxItemsDisableConverter}}"></TextBlock>                    
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>


未禁用任何项目

您试图禁用项目容器内容,而不是项目容器

您必须了解
ItemsControl
在其
ItemsSource
中包含项。通常这些项是数据模型。然后将这些模型包装到一个容器中。数据模型通常不是类型
FrameworkElement
,而是普通数据类型。为了渲染元素,它们必须是
FrameworkElement
类型,这就是模型被包装到容器中的原因,例如
ComboBoxItem
。您可以通过定义
ItemTemplate
来布局此容器的内容

您不与数据模型(容器内容)交互,而是与项目容器交互。当您仅禁用内容时,仍然可以与容器交互。项目本身已应用
填充
。因此,仍然有足够的区域允许交互

要解决问题,必须禁用容器。为此,您必须在
ItemContainerStyle
中定义触发器或setter。请注意,此
样式的
DataContext
是数据模型(
ItemsSource
中的项):



请注意,从用户角度来看,建议使用筛选从源集合中删除禁用的项。不要显示占用空间且不允许交互的内容。这可能会让人很困惑,尤其是当用户不理解项目被禁用的原因以及如何启用它们以选择它们时

ViewModel.cs

class ViewModel
{
  public ObservableCollection<MyModel> NICs { get; }

  public ViewModel()
  {
    this.NICs = new ObservableCollection<MyModel>();

    // Only show items where OperationalStatus == OperationalStatus.Up
    CollectionViewSource.GetDefaultView(this.NICs).Filter = 
      item => (item as MyModel).OperationalStatus == OperationalStatus.Up;
  }
}
类视图模型
{
公共可观察收集NIC{get;}
公共视图模型()
{
this.NICs=新的ObservableCollection();
//仅显示OperationalStatus==OperationalStatus.Up的项目
CollectionViewSource.GetDefaultView(this.NICs).Filter=
item=>(项目作为MyModel)。OperationalStatus==OperationalStatus.Up;
}
}
main window.xaml

<Window>
  <Window.DataContext>
    <ViewModel  />
  </Window.DataContext>

  <ComboBox ItemsSource="{Binding NICs}" />
</Window>

您试图禁用项目容器内容,而不是项目容器

您必须了解
ItemsControl
在其
ItemsSource
中包含项。通常这些项是数据模型。然后将这些模型包装到一个容器中。数据模型通常不是类型
FrameworkElement
,而是普通数据类型。为了渲染元素,它们必须是
FrameworkElement
类型,这就是模型被包装到容器中的原因,例如
ComboBoxItem
。您可以通过定义
ItemTemplate
来布局此容器的内容

您不与数据模型(容器内容)交互,而是与项目容器交互。当您仅禁用内容时,仍然可以与容器交互。项目本身已应用
填充
。因此,仍然有足够的区域允许交互

要解决问题,必须禁用容器。为此,您必须在
ItemContainerStyle
中定义触发器或setter。请注意,此
样式的
DataContext
是数据模型(
ItemsSource
中的项):



请注意,从用户角度来看,建议使用筛选从源集合中删除禁用的项。不要显示占用空间且不允许交互的内容。这可能会让人很困惑,尤其是当用户不理解项目被禁用的原因以及如何启用它们以选择它们时

ViewModel.cs

class ViewModel
{
  public ObservableCollection<MyModel> NICs { get; }

  public ViewModel()
  {
    this.NICs = new ObservableCollection<MyModel>();

    // Only show items where OperationalStatus == OperationalStatus.Up
    CollectionViewSource.GetDefaultView(this.NICs).Filter = 
      item => (item as MyModel).OperationalStatus == OperationalStatus.Up;
  }
}
类视图模型
{
公共可观察收集NIC{get;}
公共视图模型()
{
this.NICs=新的ObservableCollection();
//仅显示OperationalStatus==OperationalStatus.Up的项目
CollectionViewSource.GetDefaultView(this.NICs).Filter=
item=>(项目作为MyModel)。OperationalStatus==OperationalStatus.Up;
}
}
main window.xaml

<Window>
  <Window.DataContext>
    <ViewModel  />
  </Window.DataContext>

  <ComboBox ItemsSource="{Binding NICs}" />
</Window>


它是否需要IsEnabled,如果在不可交互时使用IsVisible标志使其不可见,该怎么办?不幸的是,“IsVisible”是只读属性。我将尝试使用样式将“可见性”更改为“折叠”来隐藏项目。但我仍然想知道如何完全禁用combobox项,以及我在代码中犯的错误。您能否添加名为combobox项DisabledConverter的静态资源的代码,因为wpf代码对我来说很好。启动消息更新是否需要将其启用,如果在不可交互时使用IsVisible标志使其不可见,该怎么办?不幸的是,“IsVisible”是只读属性。我将尝试使用样式将“可见性”更改为“折叠”来隐藏项目。但是我仍然想知道如何完全禁用combobox项,以及我在代码中犯的错误