多重触发器:绑定到DependencyProperty的条件不起作用

7

我有一个自定义按钮MainMenuButton,类型为UserControl,目前正在进行样式设计。 现在我想要实现一个MultiTrigger,只有当满足两个条件时才会改变按钮的外观。

第一个条件是如果IsMouseOver == true。 我简单地添加了以下Condition

<MultiTrigger>
    <MultiTrigger.Conditions>
        <Condition Property="IsMouseOver" Value="True"/>
    </MultiTrigger.Conditions>
    <MultiTrigger.EnterActions>
        <Setter TargetName="LayoutRoot" Property="Background" Value="Red">
    </MultiTrigger.EnterActions>
    <MultiTrigger.ExitActions>
        <Setter TargetName="LayoutRoot" Property="Background" Value="Black">
    </MultiTrigger.ExitActions>
</MultiTrigger>

第二个条件与DependencyProperty相关:
public static readonly DependencyProperty IsCheckedProperty = DependencyProperty.Register("IsChecked", typeof(bool), typeof(MainMenuButton), new PropertyMetadata(false));

在另一个SO帖子中,有用户说我可以使用DataTrigger来响应IsCheckedProperty

所以我尝试了另一个帖子中的代码,但它没有起作用:

<MultiTrigger>
    <MultiTrigger.Conditions>
        <Condition Property="IsMouseOver" Value="True"/>
        <Condition Binding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=IsChecked}" Value="False"/>
    </MultiTrigger.Conditions>
    <MultiTrigger.EnterActions>
        <BeginStoryboard Storyboard="{StaticResource MouseEnter}"/>
    </MultiTrigger.EnterActions>
    <MultiTrigger.ExitActions>
        <BeginStoryboard Storyboard="{StaticResource MouseLeave}"/>
    </MultiTrigger.ExitActions>
</MultiTrigger>

这个问题该怎么解决呢?感谢任何答案! :)
5个回答

13

暂时解决了这个问题。 我偶然发现了一篇博客文章,其中包含了一个可行的解决方案: http://anders.janmyr.com/search?q=multidatatrigger

我将我的代码更改为以下内容:

<MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}" Value="True"/>
                    <Condition Binding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=IsChecked}" Value="True"/>
                </MultiDataTrigger.Conditions>
                <Setter TargetName="LayoutRoot" Property="Background" Value="Red"/>
            </MultiDataTrigger>

现在它可以工作了。无论如何,感谢所有回答者的努力!


1

我猜你的风格下没有指定正确的TargetType。这个应该可以解决问题 -

<Style TargetType="{x:Type local:MainMenuButton}">
   <MultiTrigger>
    <MultiTrigger.Conditions>
        <Condition Property="IsMouseOver" Value="True"/>
        <Condition Binding="IsChecked" Value="False"/>
    </MultiTrigger.Conditions>
    // Your setter goes here
</MultiTrigger>
</Style>

应该在 XAML 中添加命名空间 local,该命名空间对应于您的 MainMenuButton 类所在的命名空间。


1
<Window x:Class="DataBinding.MultiTrigger"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MultiTrigger" Height="300" Width="300">
<Window.Resources>
    <Style TargetType="Button">
        <Style.Setters>
            <Setter Property="Background" Value="BlueViolet"></Setter>
            <Setter Property="Foreground" Value="Red"></Setter>
        </Style.Setters>
        <Style.Triggers>
            <MultiTrigger>
                <MultiTrigger.Conditions>
                    <!--Use only one conditions for Implementations-->
                    <Condition Property="Control.IsFocused" Value="True"></Condition>
                    <Condition Property="Control.IsMouseOver" Value="True"></Condition>
                </MultiTrigger.Conditions>
                <MultiTrigger.Setters>
                    <Setter Property="Background" Value="Green"></Setter>
                    <Setter Property="Foreground" Value="White"></Setter>
                </MultiTrigger.Setters>
            </MultiTrigger>
        </Style.Triggers>
    </Style>
</Window.Resources>
<Button Height="50">The World Game</Button>


添加一些解释以避免删除您的答案。 - rekaszeru

0
如果有人仍在寻找答案,我发现了这个并尝试使用。
<MultiTrigger>
    <MultiTrigger.Conditions>
        <Condition Binding="{...}" Value="..."/>
    </MultiTrigger.Conditions>
</MultiTrigger>

正如一些答案所建议的那样,但是WPF会抛出一个异常,指出MultiTrigger的“Property”不能为空。如果您想在触发器条件中使用绑定,则解决方案是使用MultiDataTrigger。

<MultiDataTrigger>
    <MultiDataTrigger.Conditions>
        <Condition Binding="{...}" Value="..."/>
    </MultiDataTrigger.Conditions>
</MultiDataTrigger>

MultiTrigger与Property配合使用,而MultiDataTrigger与绑定一起使用。

0

我认为你不需要绑定到你的 DP,尝试只使用 Property="IsChecked" 而不是 IsMouseOver。


不,它不起作用。然后出现错误“在类型'System.Windows.Controls.UserControl'上找不到模板属性'IsChecked'。” - TorbenJ
这可能是问题所在,您的控件模板目标类型是标准UserControl而不是您的自定义控件类型。当您为自定义控件构建模板时,所有DP都可以附加到触发器Property =“”。 - Sebastian Ðymel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接