3

In a UserControl I have a DP of type enum (GroupStyle of type eGroupStyle) and a DP of type bool (IsGrouped). I need to begin some storyboard in all possible conditions. But the last MultiDataTrigger works only. Where did I wrong? Also I'd like to know whether a simpler way exists to factor these conditions. (checking IsGrouped once.)

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>
Lucas
  • 3,376
  • 6
  • 31
  • 46
Mehdi
  • 2,194
  • 2
  • 25
  • 39
  • any idea? any guess? any possibility? – Mehdi Mar 30 '13 at 10:11
  • I found it out that other conditions may also work if current condition in the MultiDataTrigger sequence places before new condition! *e.g.* assume that current `GroupStyle` is set to GroupStyle2, under this condition, setting `GroupStyle` to GroupStyle3, 4, ... N works but doesn't work for GroupStyle1. This behavior is hold on for the secondary condition. e.g. If current `GroupStyle` is set to GroupStyle3 while `IsGrouped` is Flase, it'll trigger for the condition at which `IsGrouped` is set to True, but Not vice versa!!!! – Mehdi Mar 30 '13 at 10:27
  • You don't show the storyboards, and I suspect that the animations contained within them may be the problem. In particular, do you specify `FillBehavior="Stop"` on the animations within the storyboards? The triggers may be firing but the animations might not be having any effect. I recently answered [a similar question](http://stackoverflow.com/q/15657822) involving WPF triggers and animations, and it seemed that this was the case there. – Luke Woodward Mar 30 '13 at 11:19
  • Thanks @LukeWoodward. What's your opinion about my answer? – Mehdi Mar 30 '13 at 11:36
  • Thanks for posting your answer, it has the look of being 'the right answer' to me. It's possible that your question is subtly different to the one I linked to, so the answer I gave to that question may not work so well here. I imagine that removing a storyboard removes animations that might be 'holding' whatever it is you are animating, and it is these held animations that give the impression that only the last trigger is actually firing. – Luke Woodward Mar 30 '13 at 11:50

1 Answers1

9

I found it out! I need to remove the previous storyboard at the exit-action like below. Now it works :)

<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>
Mehdi
  • 2,194
  • 2
  • 25
  • 39
  • Thanks! It worked for me. But, in my case, I had another animation on the ExitActions, so I had to remove that storyboard and not the storyboard inside EnterActions. – Daniel Marques Aug 30 '18 at 13:31