几个多数据触发器仅适用于最后一个。

3
在一个名为UserControl的控件中,我有两个依赖属性(DP),一个是枚举类型(eGroupStyleGroupStyle),另一个是布尔类型(IsGrouped)。我需要在所有可能的情况下开始一些故事板。但是只有最后一个MultiDataTrigger有效。我做错了什么?此外,我想知道是否存在更简单的方法来整合这些条件(只需检查一次IsGrouped)。
C#:
enum eGroupStyle
{
    GroupStyle1,
    GroupStyle2,
    ∙∙∙,
    GroupStyleN,
}

XAML:

<MultiDataTrigger>
    <MultiDataTrigger.Conditions>
        <Condition Binding="{Binding GroupStyle}" Value="GroupStyle1"/>
        <Condition Binding="{Binding IsGrouped}" Value="False"/>
    </MultiDataTrigger.Conditions>
    <MultiDataTrigger.EnterActions>
        <BeginStoryboard  Storyboard="{StaticResource Storyboard_TurnToUnselectedStyle1}"/>
    </MultiDataTrigger.EnterActions>
</MultiDataTrigger>
<MultiDataTrigger>
    <MultiDataTrigger.Conditions>
        <Condition Binding="{Binding GroupStyle}" Value="GroupStyle1"/>
        <Condition Binding="{Binding IsGrouped}" Value="True"/>
    </MultiDataTrigger.Conditions>
    <MultiDataTrigger.EnterActions>
        <BeginStoryboard  Storyboard="{StaticResource Storyboard_TurnToSelectedStyle1}"/>
    </MultiDataTrigger.EnterActions>
</MultiDataTrigger>
<MultiDataTrigger>
    <MultiDataTrigger.Conditions>
        <Condition Binding="{Binding GroupStyle}" Value="GroupStyle2"/>
        <Condition Binding="{Binding IsGrouped}" Value="False"/>
    </MultiDataTrigger.Conditions>
    <MultiDataTrigger.EnterActions>
        <BeginStoryboard  Storyboard="{StaticResource Storyboard_TurnToUnselectedStyle2}"/>
    </MultiDataTrigger.EnterActions>
</MultiDataTrigger>
<MultiDataTrigger>
    <MultiDataTrigger.Conditions>
        <Condition Binding="{Binding GroupStyle}" Value="GroupStyle2"/>
        <Condition Binding="{Binding IsGrouped}" Value="True"/>
    </MultiDataTrigger.Conditions>
    <MultiDataTrigger.EnterActions>
        <BeginStoryboard  Storyboard="{StaticResource Storyboard_TurnToSelectedStyle2}"/>
    </MultiDataTrigger.EnterActions>
</MultiDataTrigger>
∙∙∙
<MultiDataTrigger>
    <MultiDataTrigger.Conditions>
        <Condition Binding="{Binding GroupStyle}" Value="GroupStyleN"/>
        <Condition Binding="{Binding IsGrouped}" Value="False"/>
    </MultiDataTrigger.Conditions>
    <MultiDataTrigger.EnterActions>
        <BeginStoryboard  Storyboard="{StaticResource Storyboard_TurnToUnselectedStyleN}"/>
    </MultiDataTrigger.EnterActions>
</MultiDataTrigger>
<MultiDataTrigger>
    <MultiDataTrigger.Conditions>
        <Condition Binding="{Binding GroupStyle}" Value="GroupStyleN"/>
        <Condition Binding="{Binding IsGrouped}" Value="True"/>
    </MultiDataTrigger.Conditions>
    <MultiDataTrigger.EnterActions>
        <BeginStoryboard  Storyboard="{StaticResource Storyboard_TurnToSelectedStyleN}"/>
    </MultiDataTrigger.EnterActions>
</MultiDataTrigger>

有任何想法吗?有猜测吗?有可能性吗? - Mehdi
我发现如果MultiDataTrigger序列中的当前条件在新条件之前出现,其他条件也可能有效!例如,假设当前的GroupStyle设置为GroupStyle2,在这种情况下,将GroupStyle设置为GroupStyle3,4,... N可以工作,但对于GroupStyle1不起作用。这种行为适用于次要条件。例如,如果当前的GroupStyle被设置为GroupStyle3IsGrouped是False,则它将触发IsGrouped设置为True的条件,但反之则不会!!! - Mehdi
你没有展示故事板,我怀疑其中包含的动画可能是问题所在。特别地,你是否在故事板中指定了 FillBehavior="Stop"?触发器可能已经被触发,但动画可能没有任何效果。最近我回答了一个类似的问题(http://stackoverflow.com/q/15657822),涉及到 WPF 触发器和动画,那里似乎就是这种情况。 - Luke Woodward
谢谢@LukeWoodward。你对我的回答有什么看法? - Mehdi
感谢您发布您的答案,我觉得它看起来是“正确的答案”。可能您的问题与我链接到的问题略有不同,因此我给出的那个答案在这里可能效果不佳。我想,删除一个故事板会删除可能“持有”您正在进行动画的任何东西的动画,正是这些被持有的动画给人留下了只有最后一个触发器实际触发的印象。 - Luke Woodward
1个回答

9

我发现了!我需要移除退出动作中之前的故事板,如下所示。现在它可以使用 :)

<MultiDataTrigger>
    <MultiDataTrigger.Conditions>
        <Condition Binding="{Binding Path=GroupStyle}" Value="GroupStyle1"/>
        <Condition Binding="{Binding Path=IsGrouped}" Value="False"/>
    </MultiDataTrigger.Conditions>
    <MultiDataTrigger.EnterActions>
        <BeginStoryboard x:Name="BeginStoryboard_TurnToUnselectedStyle1" Storyboard="{StaticResource Storyboard_TurnToUnselectedStyle1}"/>
    </MultiDataTrigger.EnterActions>
    <MultiDataTrigger.ExitActions>
        <RemoveStoryboard BeginStoryboardName="BeginStoryboard_TurnToUnselectedStyle1"/>
    </MultiDataTrigger.ExitActions>
</MultiDataTrigger>

谢谢!它对我起作用了。但是,在我的情况下,我在ExitActions中有另一个动画,所以我必须删除那个Storyboard而不是EnterActions内部的Storyboard。 - Daniel Marques

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