如何通过MultiDataTrigger基于父ListBoxItem的IsSelected属性修改Button背景?
错误原因
你遇到的InvalidOperationException: Must have non-null value for 'Binding',是因为在MultiDataTrigger的Condition中仅使用Property属性却未明确指定绑定源,WPF无法确定IsMouseOver属性属于哪个控件,因此抛出该错误。
修正方案
修改Button样式中的MultiDataTrigger条件,为每个条件明确指定绑定源:
修正后的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> <!-- 绑定到Button自身的IsMouseOver状态 --> <Condition Binding="{Binding IsMouseOver, RelativeSource={RelativeSource Self}}" Value="True" /> <!-- 绑定到祖先ListBoxItem的IsSelected状态 --> <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 Binding="{Binding IsMouseOver, RelativeSource={RelativeSource Self}}" 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>
关键说明
- 针对Button自身的
IsMouseOver属性,使用RelativeSource={RelativeSource Self}明确绑定源为当前Button控件。 - 针对ListBoxItem的
IsSelected属性,使用RelativeSource={RelativeSource AncestorType=ListBoxItem}向上查找最近的ListBoxItem控件,确保状态绑定正确。 - 若存在多层嵌套的ListBoxItem,可通过
AncestorLevel属性指定查找层级(例如AncestorLevel=2)。
内容的提问来源于stack exchange,提问作者Behold The Light
相关产品推荐
相关产品推荐

