C# 组合框根据触发条件更改选定项的背景色

C# 组合框根据触发条件更改选定项的背景色,c#,wpf,xaml,C#,Wpf,Xaml,我试图在wpf中对组合框执行一些操作,首先我的组合框看起来像: <ComboBox SelectedValuePath="Key" DisplayMemberPath="Value.ModuleName" controls:TextBoxHelper.Watermark="All" Height="2" IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding Modules}" commands:PropertyCha

我试图在wpf中对组合框执行一些操作,首先我的组合框看起来像:

<ComboBox SelectedValuePath="Key" DisplayMemberPath="Value.ModuleName" controls:TextBoxHelper.Watermark="All" Height="2" IsSynchronizedWithCurrentItem="True" 
    ItemsSource="{Binding Modules}" commands:PropertyChangeBehavior.Command="{Binding ModuleCommand}" 
    SelectedValue="{Binding SelectedModule, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">

<ComboBox.ItemContainerStyle>
     <Style TargetType="ComboBoxItem">
         <Style.Triggers>
              <DataTrigger Binding="{Binding Path=Value.IsWarning }" Value="True">
                    <Setter Property="Background" Value="#FF6666" />
              </DataTrigger>
          </Style.Triggers>
      </Style>
</ComboBox.ItemContainerStyle>

</ComboBox>

它所做的是,当在组合框中dictionary类属性为warning时,将其设置为true,我将获得彩色背景,并且它工作正常。 但当选定该元素时,它不起作用,当选定元素设置了警告属性时,是否有任何方法可以执行该操作?它也会更改它的选定背景,如果它为false,则表现正常,到目前为止,我尝试再添加一个触发器:

<DataTrigger Binding="{Binding Path=SelectedItem.Content}" Value="True">
   <Setter Property="Background" Value="#FF6666" />
</DataTrigger>

此外:


但是运气不好,这是可能的。

当然可能,是的。 问题在于,例如
组合框
列表框
的默认样式为其所选项目设置了无法覆盖的触发器。因此,我们需要为
ComboBoxItem
定义一个自定义模板

因此,我提出了以下非常简单的
ComboBox
样式,作为您的起点。它还远远不够完整和美观,但它提供了所需的功能

<Style TargetType="{x:Type ComboBoxItem}">
     <Style.Resources>
         <SolidColorBrush x:Key="WarningBrush" Color="#FF6666" />
         <SolidColorBrush x:Key="WarningHighlightedBrush" Color="#FF8888" />
         <SolidColorBrush x:Key="DefaultHighlightedBrush" Color="LightBlue" />
     </Style.Resources> 
     
     <Setter Property="Background" Value="{StaticResource WarningBrush}" />
         <Setter Property="Template">
             <Setter.Value>
                 <ControlTemplate TargetType="{x:Type ComboBoxItem}">
                     <Border x:Name="myBorder" Background="{TemplateBinding Background}">
                        <ContentPresenter />
                     </Border>
                     <ControlTemplate.Triggers>
                         <MultiDataTrigger>
                             <MultiDataTrigger.Conditions>
                                 <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="True"/>
                                 <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=Value.IsWarning}" Value="True"/>
                             </MultiDataTrigger.Conditions>
                             <Setter TargetName="myBorder" Property="Background" Value="{StaticResource WarningHighlightedBrush}" />
                         </MultiDataTrigger>
                         <MultiDataTrigger>
                             <MultiDataTrigger.Conditions>
                                 <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="True"/>
                                 <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=Value.IsWarning}" Value="False"/>
                             </MultiDataTrigger.Conditions>
                             <Setter TargetName="myBorder" Property="Background" Value="{StaticResource DefaultHighlightedBrush}" />
                         </MultiDataTrigger>
                     </ControlTemplate.Triggers>
                 </ControlTemplate>
             </Setter.Value>
         </Setter>
     </Style>

上面的样式会产生以下结果:


让我知道它是否也适用于您,以及您是否对建议的样式有任何其他问题/疑问

<Style TargetType="{x:Type ComboBoxItem}">
     <Style.Resources>
         <SolidColorBrush x:Key="WarningBrush" Color="#FF6666" />
         <SolidColorBrush x:Key="WarningHighlightedBrush" Color="#FF8888" />
         <SolidColorBrush x:Key="DefaultHighlightedBrush" Color="LightBlue" />
     </Style.Resources> 
     
     <Setter Property="Background" Value="{StaticResource WarningBrush}" />
         <Setter Property="Template">
             <Setter.Value>
                 <ControlTemplate TargetType="{x:Type ComboBoxItem}">
                     <Border x:Name="myBorder" Background="{TemplateBinding Background}">
                        <ContentPresenter />
                     </Border>
                     <ControlTemplate.Triggers>
                         <MultiDataTrigger>
                             <MultiDataTrigger.Conditions>
                                 <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="True"/>
                                 <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=Value.IsWarning}" Value="True"/>
                             </MultiDataTrigger.Conditions>
                             <Setter TargetName="myBorder" Property="Background" Value="{StaticResource WarningHighlightedBrush}" />
                         </MultiDataTrigger>
                         <MultiDataTrigger>
                             <MultiDataTrigger.Conditions>
                                 <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="True"/>
                                 <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=Value.IsWarning}" Value="False"/>
                             </MultiDataTrigger.Conditions>
                             <Setter TargetName="myBorder" Property="Background" Value="{StaticResource DefaultHighlightedBrush}" />
                         </MultiDataTrigger>
                     </ControlTemplate.Triggers>
                 </ControlTemplate>
             </Setter.Value>
         </Setter>
     </Style>