You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过MultiDataTrigger基于父ListBoxItem的IsSelected属性修改Button背景?

问题解决:基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 03:55:29