我试图根据父控件的IsSelected
属性,以不同的方式设置Button
的背景。我目前拥有的:我有一个ListBoxItem
,它包含一个包含Button
(或更多(的ContentControl
。我想根据ListBoxItem
的IsSelected
属性设置Button
的背景。
这是我认为会很好的代码:
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<ControlTemplate.Resources>
<ControlTemplate x:Key="DefaultOperationsField" TargetType="{x:Type ContentControl}">
<Button
Grid.Column="1"
Style="{StaticResource DiscardButtonStyle}"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
VerticalAlignment="Center"
HorizontalAlignment="Left"
Margin="5"
Command="{Binding DiscardFixtureChangesCommand}"
ToolTip="Discard changes">
</Button>
</ControlTemplate>
<ControlTemplate.Resources>
...
<ContentControl x:Name="Operations" Content="{Binding}" Template="{StaticResource DefaultOperationsField}"/>
...
</ControlTemplate>
我有Button
:的时间表
<Style x:Key="DiscardButtonStyle" TargetType="{x:Type Button}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border x:Name="border" Background="Transparent" CornerRadius="3">
<Image Source="{StaticResource Discard}" VerticalAlignment="Center" Margin="7"/>
</Border>
<ControlTemplate.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Property="IsMouseOver" Value="True" />
<Condition Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=ListBoxItem}}" Value="True" />
</MultiDataTrigger.Conditions>
<Setter TargetName="border" Property="Background" Value="{StaticResource FixtureListItemBackgroundBrush}"/>
</MultiDataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Property="IsMouseOver" Value="True" />
<Condition Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=ListBoxItem}}" Value="False" />
</MultiDataTrigger.Conditions>
<Setter TargetName="border" Property="Background" Value="{StaticResource ApplicationSelectionBorderBrush}"/>
</MultiDataTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
但是,这会导致运行时错误,并显示以下消息:
InvalidOperationException: Must have non-null value for 'Binding'.
如何根据祖先控件的属性更改Button
的背景?
如果您使用的是MultiDataTrigger
s,则每个Condition
都必须有一个与Binding
属性相关的值。在我的情况下,我选择Binding
属性作为第一个Condition
:
<MultiDataTrigger.Conditions>
<Condition Property="IsMouseOver" Value="True" />
<Condition Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=ListBoxItem}}" Value="True" />
</MultiDataTrigger.Conditions>
因此CCD_ 16。如果你想绑定到你的正常属性-就像你在正常情况下所做的那样,比如:
<Trigger Property="IsMouseOver" Value="True">
在使用MultiDataTrigger
s的情况下,它不起作用。只需将此处的Trigger
部分更改为Condition
,将Property
更改为适当的Binding
,它就会起作用。在我的情况下,这非常好:
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding IsMouseOver, ElementName=border}" Value="True" />
<Condition Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=ListBoxItem}}" Value="True" />
</MultiDataTrigger.Conditions>