C# 组合框根据触发条件更改选定项的背景色
我试图在wpf中对组合框执行一些操作,首先我的组合框看起来像: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
<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>